一、結構型模式
1.適配器模式
通過一個具體類把適配者適配到目標接口中,使得原本不兼容的那些類可以一起工作。
舉個例子:可以把二分查找和快排(適配者)封裝到一個DataOperation(目標接口)接口中,再操作Adapter(適配器)來進行操作。【Adapter(QuickSort sortobj,BinarySearch searchobj)】
2.橋接模式
將抽象部分跟實現部分分離,實現在不修改源碼的基礎上更換類,使他們都可以獨自變化來滿足開閉原則。
3.組合模式
將對象組織到樹形結構中,可以用來描述整體和部分的關系。
例:一個殺毒軟件的組成。
一步一步的實現葉子構件來完成殺毒軟件
4.裝飾模式
在不影響其他對象的情況下,以動態透明的方式給每個對象添加職責。
例:創建一個單純的窗體——>給窗體加滾動條——>把窗體變成透明窗體。
5.外觀模式
子系統中的一組接口提供一個一致的界面並定義一個接口,這個接口使得子系統更為容易的使用。
實現了子系統和用戶之間的松耦合~
6.享元模式
如其名字:共同的分享某些單元。通過共享技術有效支持大量小對象的復用,是系統只使用少量的對象。
例:五子棋。總不可以一個棋給一個小對象吧,是系統中只存在一個白/黑棋對象,在不同的地方顯示即可。
7.代理模式
客戶端不能直接引用一個對象,代理在其之間起到中介作用。
例子:寫二叉樹的時候外面不能直接訪問根節點,所以通過一個接口連向一個私有函數來訪問實現想要的功能。
再比如:VPN
二、行為型模式
1.職責鏈模式
為隔離發送者和接收者,讓多個對象都有可能接受請求,將這些對象連成一個鏈,並沿着這個鏈傳送請求,直到有對象處理它為止。
例:查找文檔系統。
注:不保證每個請求都會被處理,對於比較長的職責鏈請求可能涉及多個處理對象,系統性能可能會受到影響,而且調試時也不太方便。
2. 命令模式
請求者不必知道接受者是誰,降低耦合。就像去餐廳吃飯,點完餐並不知道是哪個廚師給你做的,這樣使一個新的命令很容易加到系統里,帶來很大的靈活性 。
3.解釋器模式
定義一個語言的文法,並建立一個解釋器來解釋該語言中的句子
例:機器人設定的up,down,left,right.
4.迭代器模式
不暴露內部數據而遍歷他。
用得太多了,STL里的iterator
5.中介者模式
用一個中介來隔離你和接收者。就像上面那個例子,你和廚師被服務員隔開,降低耦合。
6.備忘錄模式
在不破壞封裝的前提下,捕獲一個對象的內部狀態並在該對象之外保存,等對象變動時,可以隨時使對象恢復到以前的樣子。前提內存要夠。
例:游戲里掛之后點復活等一會兒復活成掛之前的狀態。
7.觀察者模式
定義對象之間一對多的依賴關系,一個對象變更時,其他對象皆自動更新。
例:有人評論了你的微博,你的各個通知欄都有提示。
8.狀態模式
允許一個對象在其內部狀態改變時改變他的行為。
例:查銀行存款,很多時數字是綠色,小於1000時是黃色,欠費是是紅色。
9.策略模式
將算法封裝到類里,在使用時,客戶端自行選擇需要的算法,像STL里封裝的sort,find等。
10.模板方法模式
c++里的template,用的太多。
11.訪問者模式
對於相同的對象,不同的角色會有不同的操作,使得對象的操作變得靈活,新增一個訪問者變得簡單,但是增加新的具體元素會違反開閉原則,所以這個模式和抽象工廠模式一樣,對開閉原則具有傾斜性。
例子:網站的游客和管理員,有不同的權利和操作。
1.適配器模式
通過一個具體類把適配者適配到目標接口中,使得原本不兼容的那些類可以一起工作。
舉個例子:可以把二分查找和快排(適配者)封裝到一個DataOperation(目標接口)接口中,再操作Adapter(適配器)來進行操作。【Adapter(QuickSort sortobj,BinarySearch searchobj)】
2.橋接模式
將抽象部分跟實現部分分離,實現在不修改源碼的基礎上更換類,使他們都可以獨自變化來滿足開閉原則。
3.組合模式
將對象組織到樹形結構中,可以用來描述整體和部分的關系。
例:一個殺毒軟件的組成。

一步一步的實現葉子構件來完成殺毒軟件
4.裝飾模式
在不影響其他對象的情況下,以動態透明的方式給每個對象添加職責。
例:創建一個單純的窗體——>給窗體加滾動條——>把窗體變成透明窗體。
5.外觀模式
子系統中的一組接口提供一個一致的界面並定義一個接口,這個接口使得子系統更為容易的使用。
實現了子系統和用戶之間的松耦合~
6.享元模式
如其名字:共同的分享某些單元。通過共享技術有效支持大量小對象的復用,是系統只使用少量的對象。
例:五子棋。總不可以一個棋給一個小對象吧,是系統中只存在一個白/黑棋對象,在不同的地方顯示即可。
7.代理模式
客戶端不能直接引用一個對象,代理在其之間起到中介作用。
例子:寫二叉樹的時候外面不能直接訪問根節點,所以通過一個接口連向一個私有函數來訪問實現想要的功能。
再比如:VPN
二、行為型模式
1.職責鏈模式
為隔離發送者和接收者,讓多個對象都有可能接受請求,將這些對象連成一個鏈,並沿着這個鏈傳送請求,直到有對象處理它為止。
例:查找文檔系統。
注:不保證每個請求都會被處理,對於比較長的職責鏈請求可能涉及多個處理對象,系統性能可能會受到影響,而且調試時也不太方便。
2. 命令模式
請求者不必知道接受者是誰,降低耦合。就像去餐廳吃飯,點完餐並不知道是哪個廚師給你做的,這樣使一個新的命令很容易加到系統里,帶來很大的靈活性 。
3.解釋器模式
定義一個語言的文法,並建立一個解釋器來解釋該語言中的句子
例:機器人設定的up,down,left,right.
4.迭代器模式
不暴露內部數據而遍歷他。
用得太多了,STL里的iterator
5.中介者模式
用一個中介來隔離你和接收者。就像上面那個例子,你和廚師被服務員隔開,降低耦合。
6.備忘錄模式
在不破壞封裝的前提下,捕獲一個對象的內部狀態並在該對象之外保存,等對象變動時,可以隨時使對象恢復到以前的樣子。前提內存要夠。
例:游戲里掛之后點復活等一會兒復活成掛之前的狀態。
7.觀察者模式
定義對象之間一對多的依賴關系,一個對象變更時,其他對象皆自動更新。
例:有人評論了你的微博,你的各個通知欄都有提示。
8.狀態模式
允許一個對象在其內部狀態改變時改變他的行為。
例:查銀行存款,很多時數字是綠色,小於1000時是黃色,欠費是是紅色。
9.策略模式
將算法封裝到類里,在使用時,客戶端自行選擇需要的算法,像STL里封裝的sort,find等。
10.模板方法模式
c++里的template,用的太多。
11.訪問者模式
對於相同的對象,不同的角色會有不同的操作,使得對象的操作變得靈活,新增一個訪問者變得簡單,但是增加新的具體元素會違反開閉原則,所以這個模式和抽象工廠模式一樣,對開閉原則具有傾斜性。
例子:網站的游客和管理員,有不同的權利和操作。