對模組、類、函式擴充套件開發、對修改關閉。強調使用抽象構建框架,用實現擴充套件細節,從而提高軟體系統的復用性和擴充套件性。開閉原則是物件導向設計中最基礎的設計原則,指導我們如何構建穩定靈活的系統。
例如:在版本更新的時候,盡可能的不修改已有源**,通過新增類來擴充套件功能。
/**
* 支付
*/public inte***ce payment
public class alipay implements payment
}public class discountalipay extends alipay
}
設計**結構時,高層模組不應該依賴底層的模組,二者應該依賴其抽象,讓細節依賴抽象。通過依賴倒置原則,可以減少類與類之間的耦合性,提高系統的穩定性,可讀性和可維護性,降低修改給程式帶來的風險。
public class wechatpay implements payment
}public class user
public void setpayment(payment payment)
public string pay(int amount)
}}
指乙個類或乙個方法,只負責乙個職責,避免修改其中乙個類或乙個方法邏輯,造成另外乙個類或方法功能故障。
職責劃分可以對功能解耦,降低系統複雜度,提高維護性性、可讀性。
例如:上面的例子中,alipay和wechatpay,支付的實現細節不同,對支付方式的不同,劃分了不同的類。
使用多個專門的總介面,而不使用乙個總的介面,客戶端不應該依賴不需要的介面。設計介面是應該遵循的幾個點:
(1)類一對一的依賴應該建立在最小的介面之上
(2)建立單一介面,不要建立臃腫的介面
(3)盡量細化介面,介面中的方法數量要適度。
介面隔離原則復合高類聚,低耦合的設計思想,類具有良好的可讀性、可擴充套件性、可維護性。介面設計的時候要多花時間思考業務模型,對可能發生的變更提前預判,所以抽象對模型的理解非常重要。
public inte***ce animal
public class bird implements animal
public void fly()
public void swing()
}public class dog implements animal
public void fly()
public void swing()
}public class cat implements animal
public void fly()
public void swing()
}
每個類都有空著的方法,dog和cat顯然是不要fly方法的,通過設計不同功能的介面進行改糙,如下:
public inte***ce flyable
public inte***ce eatable
public inte***ce swimming
public class bird implements flyable,eatable
public void fly()
}public class dog implements eatable,swimming
public void swing()
}public class cat implements eatable
}
乙個類對其他類應該有最少的了解,又叫最少知道原則,降低累於類之間的耦合性。迪公尺特法則強調只和朋友交流,不和陌生人說話,類的成員變數、方法的輸入輸出引數稱為朋友,方法體內部的類不屬於朋友。
例如:boss需要季度,年度報表,只需要找到資料部門的主管,主管讓下面擅長做報表的員工製作報表,然後主管反饋報表給boss,boss不需要自己去了解報表是怎麼做的。
**編寫中適用於父類的地方,那麼一定適用子類。所以引用父類方法的地方必須可以透明底適用子類,子類物件可以替換父類物件,而程式邏輯不變。
引申意思:子類可以擴充套件父類的功能,但不能改變父類原有功能。
(1)子類可以實現父類的抽象方法,不能覆蓋父類的非抽象方法
(2)子類可以增加自己特有的方法
(3)當子類過載父類的方法時,方法的前置條件(方法輸入引數)比父類更寬鬆
(4)子類實現父類方法時,方法的後置新增(方法輸出值)比父類更嚴格或相等。
(3)和(4)指方法的的開發程度,父類是protected,子類至少應該是protectd,寬鬆就是public; 引數如果是string,那麼子類實現和過載的方法至少應該是string,寬鬆是object;返回值父類是string,嚴格就是string的子類,相等就是string。
裡式替換的有點:
(1)約束繼承氾濫,開閉原則的一種體現
(2)增強程式的健壯性,同時變更做的非常好的相容性,提高程式維護性,擴充套件性
盡量使用物件組合、聚合,而不是繼承達到軟體復用的目的。可以降低類與類之間的耦合度,讓程式更加靈活。
繼承叫做白箱復用,父類把所有的細節暴露給子類。
組合/聚合叫做黑箱復用,對類以外的物件無法獲取到實現細節。
例如:以connection連線為例
public class productserviceimplservice最開始功能只有從資料庫查詢時,現在需要使用http連線從第三方查詢是,增加httpconnection的物件持有,就可以實現功能的擴充套件,而不是使用繼承。
總結:設計原則是學習設計模式的基礎,實際開發過程中不一定要求所有的**都遵循設計規則,考慮到人力、時間、成本、質量等多方面的因素,適當遵循設計原則。
軟體設計原則(七大原則)
本片是自己在工作閒餘時間學習軟體設計模式所獲,在這裡歸納總結,如有不足請多多指教 說到軟體設計原則,可能很多人都會和軟體設計模式混淆,尤其是對剛工作不久的童鞋,其實軟體設計原則只是我們在軟體設計中對軟體架構,各模組之間松耦合,可重用性的一種總結的抽象。而軟體設計模式傾向於軟體架構方面,是站在全域性看...
軟體設計六大原則
單一職責原則,srp 功能職責單一,只能擁抱一種變化。黎克特制替換原則,lsp 所有在使用父類的情況,都可以用子類替換。繼承的子類不能改動父類已實現的功能。依賴倒置原則,dip 高層通過抽象依賴低層,細節應該依賴抽象,抽象不應該依賴於細節。介面隔離原則,sip 從某種程度上看,介面隔離原則就是介面版...
軟體設計七大原則
軟體設計的七大原則 設計模式遵循的一般原則 1.開 閉原則 open closed principle,ocp 乙個軟體實體應當對擴充套件開發,對修改關閉.說的是,再設計乙個模組的時候,應當使這個模組可以在不被修改的前提下被擴充套件.換言之,應當可以在不必修改源 的情況下改變這個模組的行為,在保持系...