設計模式 開閉原則
阿新 • • 發佈:2018-11-26
設計模式 - 開閉原則
即 對立與統一原則
什麼是開閉原則
軟體實體應該對擴充套件開放,對修改關閉,即實體應當通過擴充套件實現變化,而不是修改程式碼實現變化
什麼是軟體實體,專案或軟體中按照一定邏輯規劃劃分的模組
抽象 類
方法
書店銷售書籍
然後書寫程式碼如下
// 書籍介面
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