面向對象設計的目標之一在於支持可維護性複用,一方面須要實現設計方案或者源碼的重用,另外一方面要確保系統可以易於擴展和修改,具備較好的靈活性。 經常使用的設計原則有七個原則:web
一個類只負責一個功能領域中的相應職責。(或者能夠定義爲:就一個類而言,只有一個緣由可以引發它變換)。編程
單一職責原則是實現高內聚、低耦合的指導方針,是最簡單的也是最難運用的原則。markdown
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{
//顯示折線圖
}
}
}
上面這個類的權責太重,將各類圖標對象的初始化代碼和顯示放在同一個類中實現,就違反了單一職責原則。svg
一個軟件實體應當對擴展開放,對修改關閉。即軟件實體應該在儘可能不修改原有代碼的狀況下進行擴展。this
若是一個軟件的設計符合開閉原則,那麼就能夠很方便地對系統進行擴展,並且在擴展的時候無需修改現有代碼,是的軟件系統擁有使用性和靈活性的同時具有較好的穩定性和延續性。
如Java中的接口、抽象類等機制,能夠經過他們的抽象層,將不一樣的實現香味移至具體的實現層完成。spa
全部引用父類的地方必須可以透明地使用期子類對象。設計
在一個軟件系統中將一個父類對象替換成它的子類對象,程序將不會產生任何錯誤和異常,則知足里氏替換原則。code
抽象不該該依賴於細節,細節應該依賴於抽象。換言之,要針對接口編程,而不是針對實現編程。orm
使用多個專門的接口,而不是使用單一的總接口,即客戶端不該該依賴那些它不須要的接口。xml
例以下面的接口就不符合接口隔離原則,這個接口在實現類中不得不將全部的方法實現(客戶端須要的和不須要的都須要實現,固然空方法也算實現)。
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();
}
儘可能使用對象的組合,而不是繼承來達到複用的目的。
這個原則就是在一個新的對象中經過關聯關係(組合關係和聚合關係)來使用一些已有的對象,使之成爲新對象的一部分,儘可能少用繼承。
一個軟件實體應當儘量少地與其餘實體發生相互做用。 迪米特法則要求在設計系統的時候,應該儘可能減小對象之間的交互,若是兩個對象之間沒必要彼此通訊,那麼兩個對象就不該該發生任何直接的相互做用;若是其中一個對象須要調用另一個對象的方法,能夠經過第三者轉發這個調用。簡而言之,就是經過引入一合理的第三者來下降現有對象之間的耦合度。