章七設計模式

chszs發表於2007-01-09
版權宣告:本文為博主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);}
};
 


相關文章