設(shè)計(jì)原則(一)開閉原則

1、英文定義:

Software entities like classes,modules and functions should be open for extension but closed for modifications.

一個(gè)軟件實(shí)體如類,模塊和函數(shù)應(yīng)該對(duì)擴(kuò)展開放,對(duì)修改關(guān)閉

舉個(gè)列子:

image.png

如圖:有一個(gè)汽車服務(wù)中心,為路過(guò)的汽車提供補(bǔ)給,有一Car類,代表過(guò)往的汽車定義了一個(gè)refuel(加油)方法,服務(wù)類調(diào)用refuel為車加油。

代碼如下:


/**
 * 汽車類
 * @author saisaimayi
 *
 */
public class Car {
    
    private String name;
    
    public Car(String name){
        this.name = name;
    }
    
    public void refuel(){
        System.out.println("refuel for "+name+" car...");
    }
}

/**

* 汽車服務(wù)中心

* @author saisaimayi

*

*/

public class CarServiceCenter {

private List<Car> cars = new ArrayList<Car>();

public void addCar(Car car){

cars.add(car);

}

public void service(){

System.out.println("service for cars...");

for (Car car : cars) {

car.refuel();

}

}

}

public class Client extends TestCase {

public void test(){

CarServiceCenter center = new CarServiceCenter();

center.addCar(new Car("volkswagan"));

center.addCar(new Car("benz"));

center.service();

}

}

這個(gè)時(shí)候如果需要添加另外一種新能源的車,不需要加油,而是需要充電(charge)。

這個(gè)時(shí)候需要怎么設(shè)計(jì)? 一般有以下兩種設(shè)計(jì)方法:

1、在類Car中新增一個(gè)charge方法,判斷如果是新能源汽車,就充電,很顯然,這不是一種好的設(shè)計(jì),意味著要改變?cè)械拇a,給原本穩(wěn)定的功能帶來(lái)的新的風(fēng)險(xiǎn)。

2、修改設(shè)計(jì),把Car抽象為接口,各種車實(shí)現(xiàn)該接口。

修改后的結(jié)構(gòu)如下:

image.png

將Car抽象為接口,其它各種車實(shí)現(xiàn)該接口,實(shí)現(xiàn)refeul方法.新能源汽車的refuel方法,調(diào)用自身的charge方法實(shí)現(xiàn)充電。

代碼如下:


/**

* 車接口

* @author saisaimayi

*

*/

public interface ICar {

      public void refuel();

}

/**

* 普通車

* @author saisaimayi

*

*/

/**
 * 普通車
 * @author saisaimayi
 *
 */
public class NormalCar implements ICar {
    
    private String name;
    
    public NormalCar(String name){
        this.name = name;
    }

    public void refuel() {
        System.out.println("refuel for normalcar "+name+"...");
    }
}

/**
 * 電動(dòng)車
 * @author saisaimayi
 *
 */
public class ElectricCar implements ICar {
    
    private String name;
    
    public ElectricCar(String name){
        this.name = name;
    }

    public void refuel() {
        System.out.println("need charge for electric car..");
        charge();
    }

    private void charge() {
        System.out.println("charge for electric car "+name+"..");
        
    }
}

/**

* 測(cè)試類

* @author saisaimayi

*

*/

/**
 * 測(cè)試類
 * @author saisaimayi
 *
 */
public class Client extends TestCase {

    public void test(){
        CarServiceCenter center = new CarServiceCenter();
        ICar volkswagan = new NormalCar("volkswagan");
        ICar benz = new ElectricCar("benz");
        center.addCar(volkswagan);
        center.addCar(benz);
        center.service();       
    }
}

service for cars...
refuel for normalcar volkswagan...
need charge for electric car..
charge for electric car benz..

使用開閉原則的理由:

1、由于對(duì)修改關(guān)閉,可以保證有新增功能時(shí),原有代碼的安全性。減少對(duì)原有功能回歸測(cè)試耗費(fèi)的時(shí)間和風(fēng)險(xiǎn)。

2、縮小代碼的邏輯粒度,增強(qiáng)可復(fù)用性。代碼可復(fù)用的概率是由代碼的粒度決定的,一般來(lái)說(shuō),代碼的邏輯粒度越小,越容易被復(fù)用。一個(gè)功能復(fù)雜的類,復(fù)用起來(lái)可能會(huì)帶來(lái)很多不便,但是如果拆分成多個(gè)小模塊,可復(fù)用的概率就提高了。開閉原則讓擴(kuò)展和原來(lái)的接口分離,實(shí)現(xiàn)了邏輯的拆分。

3、提高可靠性和可維護(hù)性。維護(hù)人員修改代碼只需關(guān)注自己擴(kuò)展的部分,可以盡量避免歷史代碼帶來(lái)的束縛與不確定的風(fēng)險(xiǎn)。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 設(shè)計(jì)模式概述 在學(xué)習(xí)面向?qū)ο笃叽笤O(shè)計(jì)原則時(shí)需要注意以下幾點(diǎn):a) 高內(nèi)聚、低耦合和單一職能的“沖突”實(shí)際上,這兩者...
    彥幀閱讀 3,888評(píng)論 0 14
  • 廢話不多說(shuō),自己進(jìn)入今天的主題 1、面向?qū)ο蟮奶卣饔心男┓矫妫?答:面向?qū)ο蟮奶卣髦饕幸韵聨讉€(gè)方面: - 抽象:...
    傳奇內(nèi)服號(hào)閱讀 2,535評(píng)論 1 31
  • 在軟件工程中,(引自維基百科)設(shè)計(jì)模式[https://zh.wikipedia.org/wiki/%E8%AE%...
    jackyshan閱讀 40,200評(píng)論 7 204
  • 轉(zhuǎn)載標(biāo)注聲明:http://www.uml.org.cn/sjms/201211023.asp 目錄:[設(shè)計(jì)模式六...
    Bloo_m閱讀 799評(píng)論 0 7
  • 這是我在運(yùn)城國(guó)際度過(guò)的的第一個(gè)暑假,這個(gè)暑假帶給我了不一樣的感受。 學(xué)校組織了諸多夏令營(yíng),我...
    赤赤赤赤赤閱讀 276評(píng)論 1 2

友情鏈接更多精彩內(nèi)容