C++設計模式之Adapter
二、結構圖
(1)class adapter(2)object adapter
三、實現
和其他很多模式一樣,學習設計模式的重點是學習每種模式的思想,而不應拘泥於它的某種具體結構圖和實現。因為模式是靈活的,其實現可以是千變萬化的,只是所謂萬變不離其宗。 在STL中大量運用了Adapter模式,象function adapter、iterator adpter,它們與這裡說的adapter結構並不一樣,但思想是一樣的。具體的介紹可到侯捷網站上找相關文章,他講得非常好。四、示例程式碼
namespace DesignPattern_Adapter // class Target // class Adapter 客戶端程式碼: |
(2)object adapter namespace DesignPattern_Adapter
{ // class Target // class Adapter 客戶端程式碼: |
六、例項
(1)STL中的Class AdapterSTL中的Adapter Class包括:a.stack(對應的adaptee是deque)。b.queue(對應的adaptee是deque)。c.priority_queue(對應的adaptee是vector)。 下面是從VC中的< stack >拷出的stack的類定義:
templateclass _Container = deque<_Ty> > stack() explicit stack(const _Container& _Cont) bool empty() const size_type size() const value_type& top() const value_type& top() const void push(const value_type& _Val) void pop() bool _Eq(const stack<_Ty, _Container>& _Right) const bool _Lt(const stack<_Ty, _Container>& _Right) const protected: |
關鍵之處在於_Container c,stack所有的操作都轉交給c去處理了。(這實際上就是前面所說的"object adapter",注意STL中的class adapter與上面所說的class adapter概念不完全一致)
stack的使用方法很簡單,如下:
{ int ia[] = { 1,3,2,4 }; deque id(ia, ia+4); stack is(id); } |
(2)近日看了一篇文章“Generic< Programming >:簡化異常安全程式碼”,原文出自http://www.cuj.com/experts/1812/alexandr.htm?topic=experts, 中文譯文出自"C++ View第5期"。 文章絕對一流,作者給出的程式碼中也使用了Adaptor模式,也有一定代表性。我將其問題一般化,概括出以下示例:
問題:假設有幾個已有類,他們有某些共同的行為,但它們彼此間是獨立的(沒有共同的基類)。如:
class T1 class T2 // ... |
如何以統一的方式去呼叫這些行為呢?
解決方法1:很自然的會想到用模板,如:
template <class T> void Test(T t) { t.Proc() ; } |
的確不錯,但這隻適用於簡單的情況,有時情況是很複雜的,比如我們無法把型別放到模板引數中!
解決方法2:困難來自於這些類沒有共同的基類,所以我們就創造一個基類,然後再Adapt。
// class IAdaptor,抽象基類 class IAdaptor { public: virtual void Proc() = 0 ; } ; // class Adaptor template <class T> class Adaptor : public IAdaptor, private T //實現繼承 { public: virtual void Proc() { T::Proc() ; } } ; // 以統一方式呼叫函式Proc,而不關心是T1、T2或其他什麼類 void Test(const std::auto_ptr& sp) { sp->Proc() ; } 客戶端程式碼: Test(std::auto_ptr(new Adaptor)) ; Test(std::auto_ptr(new Adaptor)) ; |
上例很簡單,用方法一中的模板函式就可以很好地解決了。下面是一個略微複雜一點的例子,根據引數型別來建立適當的物件:
class T1 class T2 // class IAdaptor,抽象基類 // class Adaptor class Test void Proc() { sp->Proc() ; } 客戶端程式碼: Test t2('c') ; |
上面是示例而非例項,你也許更願意看看它實際的運用。去下載作者所寫的程式碼,好好欣賞一下吧。
C++設計模式之Abstract Factory |
2002-07-23· · ··COM集中營 |
一、功能 提供一個建立一系列相關或相互依賴物件的介面,而無需指定它們具體的類。 二、結構圖 類廠最基本的結構示意圖如下:在實際應用中,類廠模式可以擴充到很複雜的情況,如下圖所示: 三、優缺點 優點:(1)封裝建立過程。客戶不用知道類廠是如何建立類例項的,類廠封閉了所有建立的細節。這樣可選擇不同的建立方法,增加了靈活性。 (2)將客戶與具體類隔離,提高了各自的可重用性。 四、實現 (1)Abstract Factory類中通常是一組Factory Method的集合。個人認為與Factory Method模式沒有本質區別。(2)通常可以把工廠作為單件。 五、示例程式碼 namespace DesignPattern_AbstractFactory 六、例項 最早知道類廠的概念是在COM中,但當時也沒想到這是如此重要的一種模式,在許多其他模式中都可以用到類廠模式。 COM中不能直接建立元件,這也是由COM的一個特性決定的:即客戶不知道要建立的元件的類名。 |
C++設計模式之Singleton | |||
2002-07-26· · ··COM集中營 |
|||
一、功能
保證一個類僅有一個例項。 三、優缺點 Singleton模式是做為"全域性變數"的替代品出現的。所以它具有全域性變數的特點:全域性可見、貫穿應用程式的整個生命期,它也具有全域性變數不具備的性質:同類型的物件例項只可能有一個。 四、實現 教科書上的Singleton定義如下:
(1)因為返回的是指標,為防止使用者呼叫delete函式,可把static Singleton *_instance;改為在Instance()中定義static Singleton _instance。這樣顯然更安全,同時也具有lazy initialization的特性(即第一次訪問時才建立)。 (1)沒子類的情況
(2)有子類的情況
|
C++模式開發之Bridge | |
2002-07-29· · ··COM集中營 |
|
一、功能 將抽象部分與它的實現部分分離,使它們都可以獨立地變化。 二、結構圖 三、示例程式碼
四、例項 (1)建立可以在X Window System和IBM的Presentation Manager系統中都可以使用的視窗。(書上的例子)Bridge的魅力在於抽象和實現之間是鬆散的關係,它們之間可以進行隨意組合。如上圖中,就有IconWindow+XWindowImp、TransientWindow+XWindowImp、IconWindow+PMWindowImp、TransientWindow+PMWindowImp四種組合。 |
C++模式設計之Builder | |
2002-07-30· · ··COM集中營 |
|
一、功能 將一個複雜物件的構建與它的表示分離,使得同樣的構建過程可以建立不同的表示。 二、結構圖 各類之間的互動關係如下圖所示:
四、例項 (1)例子一。如下圖所示: 上圖的功能是是把一個RTF檔案轉換為多種正文格式。RTFReader進行語法分析,然後將所有的token串逐一轉換。可見builder就是一步步地把各個部分組裝為一個整體。它封閉了組裝的方法,組裝出來的物件也大相徑庭。 |
C++設計模式之Prototype | |
2002-08-01· · ··COM集中營 |
|
一、功能 用原型例項指定建立物件的種類,並且通過拷貝這些原型建立新的物件。 二、結構圖 三、優缺點 優點:複製自身。客戶不知道需要物件的實際型別,只需知道它的抽象基類即可。(即有繼承樹的情況) 四、示例程式碼
五、例項 在一個圖形編輯器中,每一個圖形元素,如線、圓、文字等都應該支援拷貝操作,即點中圖形,按下Ctrl+C,再按下Ctrl+V後就會複製一個新的圖形。顯然這是一種clone操作。所以在每個從Graphic派生出的圖形子類都應運用Prototype模式,加上Clone操作。 |
C++設計模式之Factory Method | ||
2002-08-05· · ··COM集中營 |
||
一、功能 定義一個用於建立物件的介面,讓子類決定例項化哪一個類。Factory Method 使一個類的例項化延遲到其子類。 二、結構圖 三、實現 (1)在某些情況下,比如僅僅為了建立適當的Product物件而派生新的Creator子類,並且建立不同Product的方法一致時,可以考慮用模板代替繼承。如:
模板與繼承的本質區別之一是:模板:行為不依賴於型別。繼承:行為依賴於型別。(Effective C++ Item 41) 事實上,在很多模式中都存在著可以用模板代替繼承的情況,其根本原因就在於子類的行為是一致的。 四、示例程式碼
這裡的CreateProduct其實也是一個Template Method。 五、例項 Factory Method的運用太廣泛了,它經常運用在其它模式中,其例項舉不勝數。 MFC中的CDocument類就包含了類似於上圖CApplication中的三個函式。這裡的CreateDocument就是一個factory method,因為它負責建立一個文件物件。 (2) 當一個類將它的一些職責委託給一個獨立的類時,就產生了平行類層次。上圖中Figure和Manipulator就是平行類層次,Figure代表一些圖形元素,如線、文字等,Manipulator表示作用於這些圖形元素的操作,如拖拉、移動、選中等。如果這些操作所需要的狀態資訊並不需要儲存在Figure中,那麼把Figure和Manipulator分成兩個類層次是個好主意。這裡的CreateManipulator就是一個factory method。 |
C++設計模式之Composite | ||
2002-08-06· · ··COM集中營 |
||
一、功能 表示“部分-整體”關係,並使使用者以一致的方式使用單個物件和組合物件。 二、結構圖 上圖中,也可以做些擴充套件,根據需要可以將Leaf和Composite做為抽象基類,從中派生出子類來。 三、優缺點 優點:對於Composite模式,也許人們一開始的注意力會集中在它是如何實現組合物件的。但Composite最重要之處在於使用者並不關心是組合物件還是單個物件,使用者將以統一的方式進行處理,所以基類應是從單個物件和組合物件中提出的公共介面。 四、實現 有時需要限制組合中的元件,即希望一個Composite只能有某些特定的Leaf。這個問題我是用多繼承和動態型別轉換來解決的。假如組合物件Composite1只能包含單個物件ConcreteLeaf1,Composite2可以包含單個物件ConcreteLeaf1和ConcreteLeaf2。如下圖所示: 上圖中的類層次比較多,使用了AbstractLeaf1和AbstractLeaf2,但沒使用AbstractComposite1和AbstractComposite2,這個並不重要,也可以把AbstractLeaf1和AbstractLeaf2去掉,這個並不重要,可以根據具體情況決定要不要。
有兩點需要注意,一是因為用了多繼承,所以需要使用virtual inheritance。二是要用dynamic_cast來判斷是否允許組合該元件。
六、例項 (1)JUnit中就用的是Composite模式。 |
相關推薦
C 設計模式之Adapter
分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!  
C++設計模式之Adapter
一、功能 將一個類的介面轉換成客戶希望的另外一個介面,解決兩個已有介面之間不匹配的問題。Adapter模式使得原本由於介面不相容而不能一起工作的那些類可以一起工作。 二、結構圖 (1)class adapter (2)object adapter
C#設計模式之六適配器模式(Adapter Pattern)【結構型】
優點 繼續 目的 server 詳細 現實生活 態度 lin 設計 原文:C#設計模式之六適配器模式(Adapter Pattern)【結構型】一、引言 從今天開始我們開始講【結構型】設計模式,【結構型】設計模式有如下幾種:適配器模式、橋接模式、裝飾模式、組合模式、外觀
C++設計模式之介面卡(Adapter)模式
1. 標準定義介面卡模式標準定義:將一個類的介面轉換成客戶希望的另外一個介面。Adapter模式使得原本由於介面不相容而不能一起工作的那些類可以一起工作。 2. 分析和說明介面卡模式屬於結構型設計模式。適用性:你想使用一個已經存在的類,而它的介面不符合你的需求。你想建立一個
C++設計模式之狀態模式(二)
virtual alt 虛構函數 需求 rate names clas term delete 2、智能空調的設計與實現 某軟件公司將開發一套智能空調系統: 系統檢測到溫度處於20---30度之間,則切換到常溫狀態;溫度處於30---45度,則切換到制冷狀態;
c++ 設計模式之簡單的工廠模式
urn ret 應用程序 on() name clu get actor new 調試環境:vs2010 // test0.cpp : 定義控制臺應用程序的入口點。 // #include "stdafx.h" #include <iostream>
C#設計模式之工廠方法模式
實例 names 添加 創建 日誌 ring lin 數據庫日誌 連接數據庫 using System; using System.Collections.Generic; using System.Linq; using System.Text; //工廠
C# 設計模式之空對象模式
set *** 實的 中間 man blog mar 對象 同時 最近看了不少的書籍和視頻等相關資料,決定自己邊學習邊寫一下個人對設計模式的理解,如果有不對的請大家多多指正。 今天先說說我個人覺得最簡單的設計模式 -- [空對象模式] 空對象模式可以減少客戶端對對象判
C#設計模式之五創建者模式(Builder)【創建型】
包含 direct linq 自然 解釋 並且 宋體 主板 但是 一、引言 今天我們要講講Builder模式,也就是建造者模式,當然也有叫生成器模式的。在現實生活中,我們經常會遇到一些構成比較復雜的物品,比如:電腦,它就是一個復雜的物品,它主要是由CPU、主板、硬盤、顯卡
C#設計模式之四抽象工廠模式(AbstractFactory)【創建型】
抽象 抽象工廠 album 代碼 ctf bst actor 抽象工廠模式 .cn 一、引言 寫了3篇有關設計模式的文章了,大家有了些反饋,說能從中學到一些東西,我感到很欣慰,那就繼續努力。今天我要寫第四個模式了,該模式叫抽象工廠。上一篇文章我們講了【工廠方法】模式,它是為
C#設計模式之八橋接模式(Bridge)【結構型】
升級 方向 implement 詳細 .cn mage names 這樣的 意圖 一、引言 今天我們要講【結構型】設計模式的第二個模式,該模式是【橋接模式】,也有叫【橋模式】的。大家第一次看到這個名稱會想到什麽呢?我第一次看到這個模式根據名稱猜肯定是連接什麽東西的。因為
C#設計模式之行為類模式:模板方法模式
frame 應該 ocp 方式 src 代碼復用 操作 優缺點 sse 定義(Template Method) 定義一個操作中算法的框架,而將一些步驟延遲到子類中。使得子類可以不改變一個算法的結構即可重定義該算法的某些特定步驟。 啟示 組裝電腦一般包含三個部分,主機、顯示
C#設計模式之結構類模式:裝飾模式
負責 gzip null pattern 產生 設計師 san 抽象 接口 定義(Decorator Pattern): 動態的給一個對象添加一些額外的職責。就添加功能來說,它相比生成子類更為靈活。 一、引言 在軟件開發中,我們經常想要對一類對象添加不同的功能,例如要給手
C#設計模式之創建類模式:單例模式
class style 全局 線程同步 性能 就是 線程安全 應用 過程 在程序的設計過程中很多時候系統會要求對於某個類型在一個應用程序域中只出現一次,或者是因為性能的考慮,或者是由於邏輯的要求,總之是有這樣的需求的存在,那在設計模式中正好有這麽一種模式可以來滿足這樣的要求
C#設計模式之創建類模式:簡單工廠模式
div main bst http fin 想要 對象 sqlserver 關鍵字 這是記錄設計模式種的創建型模式的第一篇,所以,在開頭要說一些關於創建型模式的含義和意義。 創建型模式 軟件系統在運行時,類將被實例化成對象,並由這些被創建的對象協作完成系統中要求的各項業務功
C#設計模式之創建類模式:抽象工廠模式
nfa display color 職責 product 依賴對象 pset 並不是 config 定義:提供一個創建一系列相關或相互依賴對象的接口,而無須指定他們具體的類。 概念 要理解抽象工廠模式,首先要了解幾個概念,一個是產品等級結構,另一個是產品族。 在工廠方法模
C#設計模式之微信H5牛牛出租平臺源碼搭建模式
tee over tar ado.net 外觀 rac set ati 統一 在實際的開發過程中,由於應用環境的變化(例如開發微信H5牛牛源碼出租平臺(h5.fanshubbs.com)的變化),我們需要的實現在新的微信H5牛牛平臺扣1687054422中沒有現存對象可以滿
C#設計模式之十二代理模式(Proxy Pattern)【結構型】
ride col 安全 .html 使用權 防火墻 一對多 tro 橋接 原文:C#設計模式之十二代理模式(Proxy Pattern)【結構型】一、引言 今天我們要講【結構型】設計模式的第七個模式,也是“結構型”設計模式中的最後一個模式,該模式是【代理模式】,英文名稱
C#設計模式之十七中介者模式(Mediator Pattern)【行為型】
[] 過多 深入 理解 申請 代碼實現 控制 name 缺點 原文:C#設計模式之十七中介者模式(Mediator Pattern)【行為型】一、引言 今天我們開始講“行為型”設計模式的第五個模式,該模式是【中介者模式】,英文名稱是:Mediator Pattern。還
C#設計模式之十六觀察者模式(Observer Pattern)【行為型】
ngx 現實生活 松耦合 mon html 機制 account current 很好 原文:C#設計模式之十六觀察者模式(Observer Pattern)【行為型】一、引言 今天是2017年11月份的最後一天,也就是2017年11月30日,利用今天再寫一個模式,爭取