包括7大設計原則和23大設計模式。7大設計原則這7大設計原則不僅是23大設計模式要去遵守的,也是我們平常開發過程中要時刻去遵守的準則,所以說非常非常重要。1,單一職責原則1)定義:就一個類而言,應該僅有一個引起它變化的原因。簡而言之,就是功能要單一。2)如果一個類承擔的職責過多,就等於把這些職責耦合... ...
包括7大設計原則和23大設計模式。
7大設計原則
這7大設計原則不僅是23大設計模式要去遵守的,也是我們平常開發過程中要時刻去遵守的準則,所以說非常非常重要。
1,單一職責原則
1)定義:就一個類而言,應該僅有一個引起它變化的原因。簡而言之,就是功能要單一。
2)如果一個類承擔的職責過多,就等於把這些職責耦合在一起,一個職責的變化可能會削弱或者抑制這個類完成其它職責的能力。這種耦合會導致脆弱的設計,當變化發生時,設計會遭受到意想不到的破壞。(敏捷軟體開發)。
3)軟體設計真正要做的許多內容,就是發現職責並把那些職責相互分離。
4)單一職責原則可以看做是低耦合、高內聚在面向對象原則上的引申,將職責定義為引起變化的原因,以提高內聚性來減少引起變化的原因。責任過多,引起它變化的原因就越多,這樣就會導致職責依賴,大大損傷其內聚性和耦合度。
2,開放關閉原則
1)定義:就是說軟體實體(類,方法等等)應該可以擴展(擴展可以理解為增加),但是不能在原來的方法或者類上修改,也可以這樣說,對增加代碼開放,對修改代碼關閉。
2)兩個特征: 對於擴展(增加)是開放的,因為它不影響原來的,這是新增加的。對於修改是封閉的,如果總是修改,邏輯會越來越複雜。
3)開放封閉原則是面向對象設計的核心思想。遵循這個原則可以為我們面向對象的設計帶來巨大的好處:可維護(維護成本小,做管理簡單,影響最小)、可擴展(有新需求,增加就好)、可復用(不耦合,可以使用以前代碼)、靈活性好(維護方便、簡單)。開發人員應該僅對程式中出現頻繁變化的那些部分做出抽象,但是不能過激,對應用程式中的每個部分都刻意地進行抽象同樣也不是一個好主意。拒絕不成熟的抽象和抽象本身一樣重要。
3,里氏代替原則
1)定義:子類型必須能夠替換掉它們的父類型。更直白的說,里氏代替原則是實現面向介面編程的基礎。
2)任何基類可以出現的地方,子類一定可以出現,所以我們可以實現面向介面編程。 里氏代替原則是繼承復用的基石,只有當子類可以替換掉基類,軟體的功能不受到影響時,基類才能真正被覆用,而子類也能夠在基類的基礎上增加新的行為。里氏代換原則是對“開-閉”原則的補充。實現“開-閉”原則的關鍵步驟就是抽象化。而基類與子類的繼承關係就是抽象化的具體實現,所以里氏代換原則是對實現抽象化的具體步驟的規範。
4,依賴倒置原則
1)定義:高層模塊不應該依賴低層模塊,兩者都應該依賴其抽象;抽象不應該依賴細節,細節應該依賴抽象。簡單說就是,我們要針對介面編程,而不要針對實現編程。
2)高層模塊不應該依賴低層模塊,兩個都應該依賴抽象,因為抽象是穩定的。抽象不應該依賴具體(細節),具體(細節)應該依賴抽象。
3)依賴倒置原則其實可以說是面向對象設計的標誌,如果在我們編碼的時候考慮的是面向介面編程,而不是簡單的功能實現,體現了抽象的穩定性,只有這樣才符合面向對象的設計。
5,介面隔離原則
1)定義:指的是使用多個專門的介面比使用單一的總介面要好。也就是說不要讓一個單一的介面承擔過多的職責,而應把每個職責分離到多個專門的介面中,進行介面分離。過於臃腫的介面是對介面的一種污染。
2)使用多個專門的介面比使用單一的總介面要好。
3)一個類對另外一個類的依賴性應當是建立在最小的介面上的。
4)一個介面代表一個角色,不應當將不同的角色都交給一個介面。沒有關係的介面合併在一起,形成一個臃腫的大介面,這是對角色和介面的污染。
5)不應該強迫客戶依賴於它們不用的方法。介面屬於客戶,不屬於它所在的類層次結構。”這個說得很明白了,再通俗點說,不要強迫客戶使用它們不用的方法,如果強迫用戶使用它們不使用的方法,那麼這些客戶就會面臨由於這些不使用的方法的改變所帶來的改變。
6)介面隔離原則告訴我們,在做介面設計的時候,要儘量設計的介面功能單一,功能單一,使它變化的因素就少,這樣就更穩定,其實這體現了高內聚,低耦合的原則,這樣做也避免介面的污染。
6,組合復用原則
1)定義:就是在一個新的對象裡面使用一些已有的對象,使之成為新對象的一部分。新對象通過向這些對象的委派達到復用已用功能的目的。簡單地說,就是要儘量使用合成/聚合,儘量不要使用繼承。
2)要使用好組合復用原則,首先需要區分”Has—A”和“Is—A”的關係。 “Is—A”是指一個類是另一個類的“一種”,是屬於的關係,而“Has—A”則不同,它表示某一個角色具有某一項責任。導致錯誤的使用繼承而不是聚合的常見的原因是錯誤地把“Has—A”當成“Is—A”.例如:雞是動物,這就是“Is-A”的表現,某人有一個手槍,People類型裡面包含一個Gun類型,這就是“Has-A”的表現。
3)組合/聚合復用原則可以使系統更加靈活,類與類之間的耦合度降低,一個類的變化對其他類造成的影響相對較少,因此一般首選使用組合/聚合來實現復用;其次才考慮繼承,在使用繼承時,需要嚴格遵循里氏替換原則,有效使用繼承會有助於對問題的理解,降低複雜度,而濫用繼承反而會增加系統構建和維護的難度以及系統的複雜度,因此需要慎重使用繼承復用。
7,迪米特法則
1)定義:迪米特法則又叫最少知識原則(Least Knowledge Principle,LKP),指的是一個對象應當對其他對象有儘可能少的瞭解。也就是說,一個模塊或對象應儘量少的與其他實體之間發生相互作用,使得系統功能模塊相對獨立,這樣當一個模塊修改時,影響的模塊就會越少,擴展起來更加容易。
2)關於迪米特法則其他的一些表述有:只與你直接的朋友們通信;不要跟“陌生人”說話。
3)外觀模式(Facade Pattern)和中介者模式(Mediator Pattern)就使用了迪米特法則。
4)迪米特法則的初衷是降低類之間的耦合,實現類型之間的高內聚,低耦合,這樣可以解耦。但是凡事都有度,過分的使用迪米特原則,會產生大量這樣的中介和傳遞類,導致系統複雜度變大。所以在採用迪米特法則時要反覆權衡,既做到結構清晰,又要高內聚低耦合。
創建型
創建型設計模式提供了一種在創建對象的同時隱藏創建邏輯的方式,而不是使用 new 運算符直接實例化對象。這使得程式在判斷針對某個給定實例需要創建哪些對象時更加靈活。
創建型設計模式包括以下5種:
設計模式系列1:單例模式(Singleton Pattern)
設計模式系列2:工廠方法模式(Factory Method Pattern)
設計模式系列3:抽象工廠模式(Abstract Factory Pattern)
設計模式系列4:建造者模式(Builder Pattern)
設計模式系列5:原型模式(Prototype Pattern)
結構型
結構型設計模式關註類和對象的組合。繼承的概念被用來組合介面和定義組合對象獲得新功能的方式。
結構型設計模式包括以下7種:
設計模式系列6:適配器模式(Adapter Pattern)
設計模式系列7:橋接模式(Bridge Pattern)
設計模式系列8:裝飾模式(Decorator Pattern)
設計模式系列9:組合模式(Composite Pattern)
設計模式系列10:外觀模式(Facade Pattern)
設計模式系列11:享元模式(Flyweight Pattern)
設計模式系列12:代理模式(Proxy Pattern)
行為型
行為型設計模式主要討論的是在不同對象之間劃分責任和演算法的抽象化的問題。
行為型設計模式包括以下11種:
設計模式系列13:模板方法模式(Template Method Pattern)
設計模式系列14:命令模式(Command Pattern)
設計模式系列15:迭代器模式(Iterator Pattern)
設計模式系列16:觀察者模式(Observer Pattern)
設計模式系列17:中介者模式(Mediator Pattern)
設計模式系列18:狀態模式(State Pattern)
設計模式系列19:策略模式(Stragety Pattern)
設計模式系列20:責任鏈模式(Chain of Resp Pattern)
設計模式系列21:訪問者模式(Vistor Pattern)
設計模式系列22:備忘錄模式(Memento Pattern)
設計模式系列23:解釋器模式(Interpreter Pattern)
參考資料
- https://www.dofactory.com/net/design-patterns
- http://www.runoob.com/design-pattern/design-pattern-tutorial.html
- https://www.cnblogs.com/PatrickLiu/p/8287784.html
- https://www.cnblogs.com/abcdwxc/archive/2007/10/30/942834.html
源代碼
Github地址:https://github.com/mcgrady525/DesignPatternDemo