設計模式 開閉原則

設計模式 - 開閉原則
即 對立與統一原則java

什麼是開閉原則

軟件實體應該對擴展開放,對修改關閉,即實體應當經過擴展實現變化,而不是修改代碼實現變化git

什麼是軟件實體,項目或軟件中按照必定邏輯規劃劃分的模塊
抽象 類
方法

書店銷售書籍
數據庫

而後書寫代碼以下編程

// 書籍接口
public interface Ibook{
    // 名稱
    public String getName();
    // 售價
    public int getPrice();
    // 做者
    public String getAuthor();
}

書店出售小說類書籍,書寫代碼設計模式

public class NoveIBook implements IBook {
    // 名稱
    private String name;
    // 價格
    private int price;
    // 做者
    private String author;
    // 構造函數
    public NoveIBook(String _name, int _price, String _author){
        this.name = _name;
        this.price = _price;
        this.author = _author;
    }
    // 得到做者
    public String getAuthor(){
        return this.author;
    }
    // 價格
    public String getPrice(){
        return this.price;
    }
    // 名字
    public String getName(){
        return this.name;
    }
}

其中,價格定義爲int,不是錯誤,非金融類項目,取兩位精度,運算過程當中,擴大100倍,展現時縮小100倍。
售書架構

public class BookStore {
    private final static ArrayList bookList = new ArrayList();
    // 下發的內容,是放置在持久層,即保存到硬盤中的
    // java的三層架構爲視圖層,服務層,持久層。
    // view 層 用於接收用戶提交的請求代碼
    // service 系統的業務邏輯
    // dao 持久層,操做數據庫代碼
    // 上下層,經過接口聯繫
    static{
        bookList.add(new NoveIBook("", 3200, ""));
    }
    // 買書
    public static void main(String[] args){
        // 大數格式化
        NumberFormat formatter = NumberFormat.getCurrencyInstance();
        formatter.setMaximumFractionDigits(2);
        for(IBook book:bookList){
            System.out.println(book.getName() + book.getPrice() + book.getAuthor());
        }
    }
}

而後,發生打折。
修改接口
接口不該該修改,由於接口是持久的
修改實現類
修改getPrice()方法達到打折的目的。
可是,由於採購書籍的人,要看到實現的價格。因此不修改
擴展實現
再增長一個子類,以下
編程語言

代碼以下ide

// 打折銷售的小說
public class OffNovelBook extends NoveIBook {
    public OffNoveIBook(String _name, int _price, String _author){
        super(_name, _price, _author);
    }
    // 覆蓋銷售
    @Override
    public int getPrice(){
        return super.getPrice()*90 / 100;
    }
}

接着修改main裏面的內容便可。函數

變化

變化分爲邏輯變化,子模塊變化,可見視圖變化。this

使用開閉原則

抽象約束

抽象約束對一組事物的描述。
當商店增長了一個計算機書籍的銷售。可是計算機書籍還有不少種,有編程語言,數據庫等。

// 增長計算機書籍接口
public interface IComputerBook extends IBook{
    // 計算機書籍
    public String getScope();    // 計算機書籍的範圍
}

一樣的,書寫計算機書籍類

public class ComputerBook implements IComputerBook{
    private String name;
    private String scope;
    private String author;
    public ComputerBook(String _name, int _price, String _author, String _scope){
        this.name = _name;
        this.price = _price;
        this.author = _author;
        this.scope = _scope;
    }
    public String getScope(){
        return this.scope;
    }
    public String getName(){
        return this.name;
    } 
    public int getPrice(){
        return this.price;
    }
}

直接在main中添加便可。
總結 ; 對擴展開放,前提對抽象約束。

元數據控制模塊

即,使用配置參數,控制模塊行爲。

原則總結

單一職責

類的職責要單一

里氏替換

里氏替換原則不能破壞繼承
即,子類對象,能夠代替超類。

依賴倒置

面向接口。
即,每一個接口只負責幹一件事。

接口隔離

每一個接口只幹一件事

迪米特法則

通訊經過類之間通訊。二者之間耦合度越少越好。 ## 開閉原則 對擴展開放,對修改關閉

相關文章
相關標籤/搜索