設計模式<面向對象的常用七大設計原則>
面向對象設計的目標之一在於支持可維護性復用,一方面需要實現設計方案或者源碼的重用,另一方面要確保系統能夠易於擴展和修改,具有較好的靈活性。 常用的設計原則有七個原則:
1.單一職責原則(single responsibility principle,SPR)
一個類只負責一個功能領域中的相應職責。(或者可以定義為:就一個類而言,只有一個原因能夠引起它變換)。
單一職責原則是實現高內聚、低耦合的指導方針,是最簡單的也是最難運用的原則。
class Chart {
private String type;
public Chart(Object[][] data, String type) {
this.type = type;
if (type.equalsIgnoreCase("histogram")) {
//初始化柱狀圖
}else if (type.equalsIgnoreCase("pie")) {
//初始化餅狀圖
}else{
//初始化折線圖
}
}
public void display(){
if (this.type.equalsIgnoreCase("histogram")) {
//顯示柱狀圖
}else if (this.type.equalsIgnoreCase("pie")) {
//顯示餅狀圖
}else{
//顯示折線圖
}
}
}
上面這個類的權責過重,將各種圖標對象的初始化代碼和顯示放在同一個類中實現,就違反了單一職責原則。
2.開閉原則(Open-Close Principe,OCP)
一個軟件實體應當對擴展開放,對修改關閉。即軟件實體應該在盡量不修改原有代碼的情況下進行擴展。
如果一個軟件的設計符合開閉原則,那麽就可以很方便地對系統進行擴展,而且在擴展的時候無需修改現有代碼,是的軟件系統擁有使用性和靈活性的同時具備較好的穩定性和延續性。
如Java中的接口、抽象類等機制,可以通過他們的抽象層,將不同的實現香味移至具體的實現層完成。
3.裏氏替換原則(Liskov Substitution Principe,LSP)
所有引用父類的地方必須能夠透明地使用期子類對象。
在一個軟件系統中將一個父類對象替換成它的子類對象,程序將不會產生任何錯誤和異常,則滿足裏氏替換原則。
4.依賴倒轉原則
抽象不應該依賴於細節,細節應該依賴於抽象。換言之,要針對接口編程,而不是針對實現編程。
5.接口隔離原則
使用多個專門的接口,而不是使用單一的總接口,即客戶端不應該依賴那些它不需要的接口。
例如下面的接口就不符合接口隔離原則,這個接口在實現類中不得不將所有的方法實現(客戶端需要的和不需要的都需要實現,當然空方法也算實現)。
public interface Client {
// 從文件讀取數據
void dataRead();
// 轉換成XML格式
void transformToXML();
// 創建圖表
void createChart();
// 顯示圖表
void displayChart();
// 創建文字報表
void createReport();
// 顯示文字報表
void displayReport();
}
應該講接口拆分成一下四個接口:
public interface DataHandler {
// 從文件讀取數據
void dataRead();
}
public interface XMLTransformer {
// 轉換成XML格式
void transformToXML();
}
public interface ChartHandler {
// 創建圖表
void createChart();
// 顯示圖表
void displayChart();
}
public interface ReportHandler {
// 創建文字報表
void createReport();
// 顯示文字報表
void displayReport();
}
6.合成復用原則(Composite Reuse Principe,CRP)
盡量使用對象的組合,而不是繼承來達到復用的目的。
這個原則就是在一個新的對象中通過關聯關系(組合關系和聚合關系)來使用一些已有的對象,使之成為新對象的一部分,盡量少用繼承。
7.迪米特法則(Law of Demeter,LoD)
一個軟件實體應當盡可能少地與其他實體發生相互作用。
迪米特法則要求在設計系統的時候,應該盡量減少對象之間的交互,如果兩個對象之間不必彼此通信,那麽兩個對象就不應該發生任何直接的相互作用;如果其中一個對象需要調用另外一個對象的方法,可以通過第三者轉發這個調用。簡而言之,就是通過引入一合理的第三者來降低現有對象之間的耦合度。
設計模式<面向對象的常用七大設計原則>