天天看點

java設計模式七大原則---5、開閉原則開閉原則

開閉原則

一個實體(類)子產品和函數應該對擴充(提供方)開放,對修改關閉(使用方),用抽象建構架構,用實作擴充細節      
增加功能盡量通過擴充,而不是修改      

老規矩舉個例子:

定義一個畫圖程式,首先,你得根據傳進來的形狀類判斷形狀

class Type {
    int type;
}
//根據圖形類型,畫不同的畫
class Editor{
    public void draw(Type t){
        if(t.type==0){
//            0是圓型
            drawCir();
        }else if(t.type==2){
//            1是方型
            drawSqu();
        }
    }
    public void drawCir(){
        System.out.println("畫圓形");
    }
    public void drawSqu(){
        System.out.println("畫方形");
    }
}
class Circular extends Type{
    public Circular(){
        super.type=0;
    }
}
class Square extends Type{
    public Square(){
        super.type=1;
    }
}
           

這樣做看樣子是實作了需求,但這裡如果要定義其他類型呢?

1.建立其他類型的類

2.再加形狀判斷(if-else)

這樣就會對使用方進行更改,顯然這是不符合原則和麻煩的,if-else慢慢就成了屎山代碼了

是以,我們對上面代碼進行改進:

首先,判斷,都有一個方法畫圖,還有一個成員變量 表示類型。把這兩個整合成一個抽象類

讓其他形狀類繼承抽象類,這樣根據功能擴充其細節類即可,在操作端,也隻是傳入相應子類對象就能調用相應重寫的方法。

代碼:

//滿足開閉原則
//定義一個抽象類
abstract class Type1{
    int type;
    public abstract void draw();
}
class Circular1 extends Type1{
    public Circular1(){
        super.type=0;
    }

    @Override
    public void draw() {
        System.out.println("畫圓形");
    }
}
class Square1 extends Type1{
    public Square1(){
        super.type=1;
    }

    @Override
    public void draw() {
        System.out.println("畫方形");
    }
}
//使用類
class Editor2{
    public void draw(Type1 t1) {
        t1.draw();
    }
           

繼續閱讀