00 |設計模式 開篇詳解

Design pattern

主要用途

  • 開發人員的共同平臺
    設計模式提供了一個標準的術語系統,且具體到特定的情景。eg,單例
  • 最佳的實踐
    它們提供了軟件開發過程中面臨的一般問題的最佳解決方案。

設計模式的六大原則

1、開閉原則(Open Close Principle)

開閉原則的意思是:對擴展開放,對修改關閉。
在程序需要進行拓展的時候,不能去修改原有的代碼,實現一個熱插拔的效果。簡言之,是爲了使程序的擴展性好,易於維護和升級。
想要達到這樣的效果,我們需要使用接口和抽象類。

2、里氏代換原則(Liskov Substitution Principle)

任何基類可以出現的地方,子類一定可以出現。
LSP 是繼承複用的基石,只有當派生類可以替換掉基類,且軟件單位的功能不受到影響時,基類才能真正被複用,而派生類也能夠在基類的基礎上增加新的行爲。

3、依賴倒轉原則(Dependence Inversion Principle)

這個原則是開閉原則的基礎,具體內容:針對對接口編程,依賴於抽象而不依賴於具體。

  • 低層模塊:不可分割的原子邏輯,可能會根據業務邏輯經常變化。
  • 高層模塊:低層模塊的再組合,對低層模塊的抽象。
  • 抽象: 接口或抽象類(是底層模塊的抽象,特點:不能直接被實例化)
  • 與接口或抽象類對應的實現類:低層模塊的具體實現(特點:可以直拉被實例化)

“高層模塊不應該依賴於低層模塊,二者都應該依賴於抽象。”這一原則在分層架構模式中,得到了淋漓盡致地運用。

eg:汽車駕駛的一個例子
在這裏插入圖片描述
在這裏插入圖片描述
場景運行結果如下:
在這裏插入圖片描述
現在張三賺了一些錢,買了一輛寶馬汽車: 就悲劇了
所以需要修改依賴,解耦。
在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述

4、接口隔離原則(Interface Segregation Principle)ISP

使用多個隔離的接口,比使用單個接口要好。
客戶端不應該依賴它不需要的接口
降低類之間的耦合度。
類間的依賴關係應該建立在最小的接口上。
必須首先滿足單一職責原則

接口分爲以下兩種:

  • 實例接口(Object Interface):
    在Java中聲明一個類,然後用new關鍵字產生一個實例,是對一個類型的事物的描述,這就是一種接口。或許我們乍一看會有點懵,怎麼和我們原來學習的接口不一樣呢,其實我們這樣想,我們都知道,在Java中有一個Class類,表示正在運行的類和接口,換句話說每一個正在運行時的類或接口都是Class類的對象,這是一種向上的抽象。接口是一種更爲抽象的定義,類是一類相同事物的描述集合,那爲什麼不可以抽象爲一個接口呢?
  • 類接口(Class Interface):
    這就是我們經常使用的用interface定義的接口

其實通俗來理解就是,不要在一個接口裏面放很多的方法,這樣會顯得這個類很臃腫不堪。接口應該儘量細化,一個接口對應一個功能模塊,同時接口裏面的方法應該儘可能的少,使接口更加輕便靈活。

未遵循接口隔離原則的設計:
在這裏插入圖片描述
遵循接口隔離原則的設計:
在這裏插入圖片描述

根據接口隔離原則拆分接口時,必須首先滿足單一職責原則。

舉例:
星探 找 美女。
在這裏插入圖片描述

public interface IPettyGirl {
//要有姣好的面孔
public void goodLooking();
//要有好身材
public void niceFigure();
//要有氣質
public void greatTemperament();
}

public class PettyGirl implements IPettyGirl {
private String name;
//美女都有名字
public PettyGirl(String _name){
 this. name=_name;
 }
//臉蛋漂亮
public void goodLooking() {
 System. out.println(this. name + "---臉蛋很漂亮!");
 }
//氣質要好
public void greatTemperament() {
 System. out.println(this. name + "---氣質非常好!");
 }
//身材要好
public void niceFigure() {
 System. out.println(this. name + "---身材非常棒!");
 }
}
/////星探
public abstract class AbstractSearcher {
protected IPettyGirl pettyGirl;
public AbstractSearcher(IPettyGirl _pettyGirl){
 this.pettyGirl = _pettyGirl;
 }
//搜索美女,列出美女信息
public abstract void show();
}

//////
public class Client {
//搜索並展示美女信息
public static void main(String[] args) {
 //定義一個美女
 IPettyGirl yanYan = new PettyGirl(" 嫣嫣");
 AbstractSearcher searcher = new Searcher(yanYan);
 searcher.show();
 }
}

--------美女的信息如下: ---------------
嫣嫣---臉蛋很漂亮!
嫣嫣---身材非常棒!
嫣嫣---氣質非常好!

but有些女孩 只擁有 其中 3種 優點中的1 2種。怎麼辦?
那麼,細化接口:

public interface IGoodBodyGirl {
//要有姣好的面孔
public void goodLooking();
//要有好身材
public void niceFigure();
}

public interface IGreatTemperamentGirl {
//要有氣質
public void greatTemperament();
}

////實現類沒有改變,只是實現類兩個接口,源碼如下:
public class PettyGirl implements IGoodBodyGirl,IGreatTemperamentGirl {
private String name;
//美女都有名字
public PettyGirl(String _name){
 this. name=_name;
 }
//臉蛋漂亮
public void goodLooking() {
 System. out.println(this. name + "---臉蛋很漂亮!");
 }
//氣質要好
public void greatTemperament() {
 System. out.println(this. name + "---氣質非常好!");
 }
//身材要好
public void niceFigure() {
 System. out.println(this. name + "---身材非常棒!");
 }
}

5、迪米特法則,又稱最少知道原則(Demeter Principle)

最少知道原則是指:
通俗的說法有很多,比如,只與你直接的朋友們通信;不要跟“陌生人”說話;
高內聚,低耦合。

一個實體應當儘量少地與其他實體之間發生相互作用,使得系統功能模塊相對獨立。
在這裏插入圖片描述
在這裏插入圖片描述

6、合成複用原則(Composite Reuse Principle)

合成複用原則是指:儘量使用合成/聚合的方式,而不是使用繼承。

合成/聚合複用原則是在一個新的對象裏面使用一些已有的對象,使之成爲新對象的一部分;新的對象通過向這些對象的委派達到複用已有功能的目的。
eg:
在這裏插入圖片描述
在這裏插入圖片描述

設計模式的類型

創建型模式

這些設計模式提供了一種在創建對象的同時隱藏創建邏輯的方式,而不是使用新的運算符直接實例化對象。這使得程序在判斷針對某個給定實例需要創建哪些對象時更加靈活。

工廠模式(Factory Pattern)
抽象工廠模式(Abstract Factory Pattern)
單例模式(Singleton Pattern)
建造者模式(Builder Pattern)
原型模式(Prototype Pattern)

結構型模式

這些設計模式關注類和對象的組合。繼承的概念被用來組合接口和定義組合對象獲得新功能的方式。

適配器模式(Adapter Pattern)
橋接模式(Bridge Pattern)
過濾器模式(Filter、Criteria Pattern)
組合模式(Composite Pattern)
裝飾器模式(Decorator Pattern)
外觀模式(Facade Pattern)
享元模式(Flyweight Pattern)
代理模式(Proxy Pattern)

行爲型模式

這些設計模式特別關注對象之間的通信。

責任鏈模式(Chain of Responsibility Pattern)
命令模式(Command Pattern)
解釋器模式(Interpreter Pattern)
迭代器模式(Iterator Pattern)
中介者模式(Mediator Pattern)
備忘錄模式(Memento Pattern)
觀察者模式(Observer Pattern)
狀態模式(State Pattern)
空對象模式(Null Object Pattern)
策略模式(Strategy Pattern)
模板模式(Template Pattern)
訪問者模式(Visitor Pattern)

J2EE 模式

這些設計模式特別關注表示層。這些模式是由 Sun Java Center 鑑定的。

MVC 模式(MVC Pattern)
業務代表模式(Business Delegate Pattern)
組合實體模式(Composite Entity Pattern)
數據訪問對象模式(Data Access Object Pattern)
前端控制器模式(Front Controller Pattern)
攔截過濾器模式(Intercepting Filter Pattern)
服務定位器模式(Service Locator Pattern)
傳輸對象模式(Transfer Object Pattern)

在這裏插入圖片描述

參考文章

https://www.w3cschool.cn/shejimoshi/design-pattern-intro.html
https://www.cnblogs.com/oumyye/p/4392854.html
https://blog.csdn.net/zhonghuan1992/article/details/38358183

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章