版權聲明:本文為部落客chszs的原創文章,未經部落客允許不得轉載。 https://blog.csdn.net/chszs/article/details/1477649
章七 設計模式
一、設計模式的分類
1、共包含23個設計模式
1)Abstract Factory
提供一個建立一系列相關或互相依賴對象的接口,而無需指定它們具體的類。
2)Adapter
将一個類的接口轉換成客戶希望的另一個接口。
3)Bridge
将抽象部分與實作部分分離,使它們可以獨立變化。
4)Builder
将一個複雜對象的建構與它的表示分離,使得同樣的建構過程可以建立不同的表示。
5)Chain of Responsibility
為解除請求的發送者和接收者之間的耦合,而使多個對象都有機會處理這個請求。
6)Command
将一個請求封裝為一個對象,進而可用不同的請求對客戶進行參數化。
7)Composite
将對象組合成樹形結構以表示“整體-部分”的層次結構,使客戶對單個對象和複合對象的使用具有一緻性。
8)Decorator
動态地給一個對象添加一些額外的職責。
9)Facade
為子系統中的一組接口提供一個一緻的界面。
10)Factory Method
定義一個用于建立對象的接口,讓子類決定将哪一個類執行個體化。
11)Flyweight
運用共享技術有效的支援大量細粒度的對象。
12)Interpreter
給定一個語言,定義其文法的一種表示,并定義一個解釋器,該解釋器使用該表示來解釋語言中的句子。
13)Iterator
提供一種方法順序通路一個聚合對象中各個元素,而不需暴露該對象的内部表示。
14)Mediator
用一個中介對象來封裝一系列的對象互動。
15)Memento
在不破壞封裝性的前提下,捕獲一個對象的内部狀态,并在該對象之外儲存這個狀态。
16)Observer
定義對象間的一對多的依賴關系,以便當一個對象狀态發生改變時,所有依賴于它的對象都得到通知并自動重新整理。
17)Prototype
用原型執行個體指定建立對象的種類,并且通過拷貝這個原型來建立新的對象。
18)Proxy
為其它對象提供一個代理以控制這個對象的通路。
19)Singleton
保證一個類僅有一個執行個體,并提供一個通路它的全局通路點。
20)State
允許一個對象在其内部狀态改變時改變它的行為。
21)Strategy
定義一系列的算法,把它們一個個封裝起來,并且使它們可互相替換。
22)Template Method
定義一個操作中的算法的骨架,而将一些步驟延遲到子類中。
23)Visitor
表示一個作用于某對象結構中的各元素的操作。可以在不改變各元素的類的前提下定義作用于這些元素的新操作。
2、各模式詳述
1)Abstract Factory-對象建立模式
意圖:提供一個建立一系列相關或互相依賴對象的接口,而無需指定它們具體的類。
為保證可移植性,一個應用不能為一個特定的視感外觀寫死它的視窗元件。在整個應用中執行個體化特定視感風格的視窗元件類将使得以後很難改變視感。
解決方法:
(1)定義一個抽象的WidgetFactory類;
(2)聲明一個建立每一類基本視窗元件的接口;
(3)每一類視窗元件都有一個抽象類,而具體子類則實作了視窗元件的特定視感風格;
(4)對每一個抽象視窗元件類,WidgetFactory接口都有一個傳回新視窗元件執行個體。
适用性:
(1)一個系統要獨立于它的産品的建立、組合和表示時;
(2)一個系統要由多個産品系列中的一個來配置時;
(3)要強調一系列相關産品的對象設計以便進行聯合使用時;
(4)提供一個産品類庫,而隻想顯示它們的接口而不是實作時。
參與者:
(1)AbstractFactory(WidgetFactory) 聲明一個建立抽象産品對象的操作接口
(2)ConcreteFactory(MotifWidgetFactory,PMWidgetFactory) 實作建立具體産品對象的操作;
(3)AbstractProduct(Windows,ScrollBar) 為一類産品對象聲明一個接口。
(4)ConcreateProduct(MotifWindow,MotifScrollBar) 定義一個被相應的具體工廠建立的産品對象,實作接口;
(5)Client 僅使用AbstractFactory和AbstractProduct類聲明的接口。
優缺點:
(1)分離了具體的類;
(2)使得易于交換産品系列;
(3)有利于産品的一緻性;
(4)難以支援新種類的産品。
實作:
(1)将工廠作為Singleton;
(2)建立産品;
(3)定義可擴充的工廠。
代碼示例:
class Mazefactory{
public:
MazeFactory();
virtual Maze* MakeMaze() const
{return new Maze;}
virtual Wall* MakeWall() const
{return new Wall;}
virtual Room* MakeRoom(int n) const
{return new Room(n);}
virtual Door* MakeDoor(Room* r1, Room* r2) const
{return new Door(r1,r2);}
};