設計模式 - 開閉原則
即 對立與統一原則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中添加便可。
總結 ; 對擴展開放,前提對抽象約束。
即,使用配置參數,控制模塊行爲。
類的職責要單一
里氏替換原則不能破壞繼承
即,子類對象,能夠代替超類。
面向接口。
即,每一個接口只負責幹一件事。
每一個接口只幹一件事
通訊經過類之間通訊。二者之間耦合度越少越好。 ## 開閉原則 對擴展開放,對修改關閉