1. 程式人生 > >設計模式 開閉原則

設計模式 開閉原則

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

什麼是開閉原則

軟體實體應該對擴充套件開放,對修改關閉,即實體應當通過擴充套件實現變化,而不是修改程式碼實現變化

什麼是軟體實體,專案或軟體中按照一定邏輯規劃劃分的模組
抽象 類
方法

書店銷售書籍

然後書寫程式碼如下

// 書籍介面
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()方法達到打折的目的。
但是,因為採購書籍的人,要看到實現的價格。所以不修改
擴充套件實現
再增加一個子類,如下

程式碼如下

// 打折銷售的小說
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裡面的內容即可。

變化

變化分為邏輯變化,子模組變化,可見檢視變化。

使用開閉原則

抽象約束

抽象約束對一組事物的描述。
當商店增加了一個計算機書籍的銷售。但是計算機書籍還有很多種,有程式語言,資料庫等。

// 增加計算機書籍介面
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中新增即可。
總結 ; 對擴充套件開放,前提對抽象約束。

元資料控制模組

即,使用配置引數,控制模組行為。

原則總結

單一職責

類的職責要單一

里氏替換

里氏替換原則不能破壞繼承
即,子類物件,可以代替超類。

依賴倒置

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

介面隔離

每個介面只幹一件事

迪米特法則

通訊通過類之間通訊。兩者之間耦合度越少越好。
## 開閉原則
對擴充套件開放,對修改關閉
www.iming.info