C++設(shè)計模式(核心板)--精選文檔_第1頁
C++設(shè)計模式(核心板)--精選文檔_第2頁
已閱讀5頁,還剩13頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

1、C+設(shè)計模式一、功能  將一個類的接口轉(zhuǎn)換成客戶希望的另外一個接口,解決兩個已有接口之間不匹配的問題。Adapter模式使得原本由于接口不兼容而不能一起工作的那些類可以一起工作。 二、結(jié)構(gòu)圖(1)class adapter (2)object adapter     三、實現(xiàn)和其他很多模式一樣,學(xué)習(xí)設(shè)計模式的重點(diǎn)是學(xué)習(xí)每種模式的思想,而不應(yīng)拘泥于它的某種具體結(jié)構(gòu)圖和實現(xiàn)。因為模式是靈活的,其實現(xiàn)可以是千變?nèi)f化的,只是所謂萬變不離其宗。 在STL中大量運(yùn)用了Adapter模式,象function adapter、iterator adpter,它們與這里說

2、的adapter結(jié)構(gòu)并不一樣,但思想是一樣的。具體的介紹可到侯捷網(wǎng)站上找相關(guān)文章,他講得非常好。 四、示例代碼(1)class adapter namespace DesignPattern_Adapter/ class Adapteeclass Adapteepublic:void SpecialRequest() ;/ class Targetclass Targetpublic:virtual void Request() = 0 ; ;/ class Adapterclass Adapter : public Target, private Adapteepublic:virtual

3、void Request() SpecialRequest() ; ;客戶端代碼:using namespace DesignPattern_Adapter ;Target *p = new Adapter() ;p->Request() ; /實際上調(diào)用的是Adaptee:SpecialRequest()(2)object adapter namespace DesignPattern_Adapter/ class Adapteeclass Adapteepublic:void SpecialRequest() ;/ class Targetclass Targetpublic:vir

4、tual void Request() = 0 ; ;/ class Adapterclass Adapter : public Targetpublic:virtual void Request() _adaptee.SpecialRequest() ; private:Adaptee _adaptee ; ;客戶端代碼:using namespace DesignPattern_Adapter ;Target *p = new Adapter() ;p->Request() ; /實際上調(diào)用的是Adaptee:SpecialRequest()六、實例(1)STL中的Class Ada

5、pter STL中的Adapter Class包括:a.stack(對應(yīng)的adaptee是deque)。b.queue(對應(yīng)的adaptee是deque)。c.priority_queue(對應(yīng)的adaptee是vector)。 下面是從VC中的< stack >拷出的stack的類定義: templateclass _Container = deque<_Ty> >class stack / LIFO queue implemented with a containerpublic:typedef _Container container_type;typede

6、f typename _Container:value_type value_type;typedef typename _Container:size_type size_type;stack(): c() / construct with empty containerexplicit stack(const _Container& _Cont): c(_Cont) / construct by copying specified containerbool empty() const / test if stack is emptyreturn (c.empty();size_t

7、ype size() const / test length of stackreturn (c.size();value_type& top() / return last element of mutable stackreturn (c.back();const value_type& top() const / return last element of nonmutable stackreturn (c.back();void push(const value_type& _Val) / insert element at endc.push_back(_V

8、al);void pop() / erase last elementc.pop_back();bool _Eq(const stack<_Ty, _Container>& _Right) const / test for stack equalityreturn (c = _Right.c);bool _Lt(const stack<_Ty, _Container>& _Right) const / test if this < _Right for stacksreturn (c < _Right.c);protected:_Contai

9、ner c; / the underlying container;關(guān)鍵之處在于_Container c,stack所有的操作都轉(zhuǎn)交給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 >:簡化異常安全代碼”,原文出自 中文譯文出自"C+ V

10、iew第5期"。 文章絕對一流,作者給出的代碼中也使用了Adaptor模式,也有一定代表性。我將其問題一般化,概括出以下示例: 問題:假設(shè)有幾個已有類,他們有某些共同的行為,但它們彼此間是獨(dú)立的(沒有共同的基類)。如: class T1public:void Proc() ;class T2public:void Proc() ;/ .如何以統(tǒng)一的方式去調(diào)用這些行為呢? 解決方法1:很自然的會想到用模板,如: template <class T>void Test(T t)t.Proc() ; 的確不錯,但這只適用于簡單的情況,有時情況是很復(fù)雜的,比如我們無法把類型放到模

11、板參數(shù)中! 解決方法2:困難來自于這些類沒有共同的基類,所以我們就創(chuàng)造一個基類,然后再Adapt。 / class IAdaptor,抽象基類class IAdaptorpublic:virtual void Proc() = 0 ; ; / class Adaptortemplate <class T>class Adaptor : public IAdaptor, private T /實現(xiàn)繼承public:virtual void Proc() T:Proc() ; ;/ 以統(tǒng)一方式調(diào)用函數(shù)Proc,而不關(guān)心是T1、T2或其他什么類void Test(const std:au

12、to_ptr& sp)sp->Proc() ;客戶端代碼:Test(std:auto_ptr(new Adaptor) ;Test(std:auto_ptr(new Adaptor) ; 上例很簡單,用方法一中的模板函數(shù)就可以很好地解決了。下面是一個略微復(fù)雜一點(diǎn)的例子,根據(jù)參數(shù)類型來創(chuàng)建適當(dāng)?shù)膶ο螅篶lass T1public:T1(int) /*.*/ void Proc() /*.*/ ;class T2public:T2(char) /*.*/ void Proc() /*.*/ ;/ class IAdaptor,抽象基類class IAdaptorpublic:virt

13、ual void Proc() = 0 ; ;/ class Adaptortemplate class Adaptor : public IAdaptor, private T /實現(xiàn)繼承public:Adaptor(int n) : T(n) Adaptor(char c) : T(c) virtual void Proc() T:Proc() ; ;class Testpublic:Test(int n) : sp(new Adaptor(n) Test(char c) : sp(new Adaptor(c) void Proc() sp->Proc() ; private:std

14、:auto_ptr sp ; ;客戶端代碼:Test t1(10) ;t1.Proc() ;Test t2('c') ;t2.Proc() ;上面是示例而非實例,你也許更愿意看看它實際的運(yùn)用。去下載作者所寫的代碼,好好欣賞一下吧。C+設(shè)計模式之Abstract Factory 一、功能 提供一個創(chuàng)建一系列相關(guān)或相互依賴對象的接口,而無需指定它們具體的類。 二、結(jié)構(gòu)圖類廠最基本的結(jié)構(gòu)示意圖如下: 在實際應(yīng)用中,類廠模式可以擴(kuò)充到很復(fù)雜的情況,如下圖所示: 三、優(yōu)缺點(diǎn)優(yōu)點(diǎn):(1)封裝創(chuàng)建過程??蛻舨挥弥李悘S是如何創(chuàng)建類實例的,類廠封閉了所有創(chuàng)建的細(xì)節(jié)。這樣可選擇不同的創(chuàng)

15、建方法,增加了靈活性。 (2)將客戶與具體類隔離,提高了各自的可重用性。 缺點(diǎn):Factory類層次與具體類層次通常是平行的(即一一對應(yīng)的)。增加一個具體類,一般也要相應(yīng)地增加一個factory類,增加了系統(tǒng)復(fù)雜度。 四、實現(xiàn)(1)Abstract Factory類中通常是一組Factory Method的集合。個人認(rèn)為與Factory Method模式?jīng)]有本質(zhì)區(qū)別。 (2)通??梢园压S作為單件。 五、示例代碼namespace DesignPattern_AbstractFactoryclass AbstractProductA ; / Product Aclass ProductA1 :

16、 public AbstractProductA ;class ProductA2 : public AbstractProductA ;class AbstractProductB ; / Product Bclass ProductB1 : public AbstractProductB ;class ProductB2 : public AbstractProductB ;class AbstractFactorypublic:virtual AbstractProductA* CreateProductA() = 0 ;/ 創(chuàng)建ProductAvirtual AbstractProdu

17、ctB* CreateProductB() = 0 ;/ 創(chuàng)建ProductB ;class ConcreteFactory1 : public AbstractFactorypublic:virtual AbstractProductA* CreateProductA() return new ProductA1() ; virtual AbstractProductB* CreateProductB() return new ProductB1() ; static ConcreteFactory1* Instance() static ConcreteFactory1 instance

18、; return &instance ; protected:ConcreteFactory1() private:ConcreteFactory1(const ConcreteFactory1&) ;ConcreteFactory1& operator=(const ConcreteFactory1&) ; ;class ConcreteFactory2 : public AbstractFactorypublic:virtual AbstractProductA* CreateProductA() return new ProductA2() ; virtu

19、al AbstractProductB* CreateProductB() return new ProductB2() ; static ConcreteFactory2* Instance() static ConcreteFactory2 instance ; return &instance ; protected:ConcreteFactory2() private:ConcreteFactory2(const ConcreteFactory2&) ;ConcreteFactory2& operator=(const ConcreteFactory2&

20、) ; ;客戶端代碼:using namespace DesignPattern_AbstractFactory ;/ 第一種創(chuàng)建方法AbstractFactory *pFactory = ConcreteFactory1:Instance() ;AbstractProductA *pProductA = pFactory->CreateProductA() ;AbstractProductB *pProductB = pFactory->CreateProductB() ;/ 第二種創(chuàng)建方法pFactory = ConcreteFactory2:Instance() ;pProd

21、uctA = pFactory->CreateProductA() ;pProductB = pFactory->CreateProductB() ; 六、實例最早知道類廠的概念是在COM中,但當(dāng)時也沒想到這是如此重要的一種模式,在許多其他模式中都可以用到類廠模式。 COM中不能直接創(chuàng)建組件,這也是由COM的一個特性決定的:即客戶不知道要創(chuàng)建的組件的類名。C+設(shè)計模式之Singleton 一、功能 保證一個類僅有一個實例。 二、結(jié)構(gòu)圖三、優(yōu)缺點(diǎn)Singleton模式是做為"全局變量"的替代品出現(xiàn)的。所以它具有全局變量的特點(diǎn):全局可見、貫穿應(yīng)用程序的整個

22、生命期,它也具有全局變量不具備的性質(zhì):同類型的對象實例只可能有一個。 四、實現(xiàn)教科書上的Singleton定義如下: class Singletonpublic:static Singleton* Instance() ;protected:Singleton() private:static Singleton *_instance ;Singleton(const Singleton&) ;Singleton& operator=(const Singleton&) ; ;Singleton* Singleton:_instance = NULL ;Singleto

23、n* Singleton:Instance()(_instance = NULL) ? _instance = new Singleton() : 0 ; /lazy initializationreturn _instance ;(1)因為返回的是指針,為防止用戶調(diào)用delete函數(shù),可把static Singleton *_instance;改為在Instance()中定義static Singleton _instance。這樣顯然更安全,同時也具有l(wèi)azy initialization的特性(即第一次訪問時才創(chuàng)建)。 (2)假設(shè)需要從Singleton派生子類,而子類也需要有同樣的性質(zhì)

24、,既只能創(chuàng)建一個實例。我覺得,這很難辦。根本原因在于Instance()函數(shù)不是虛函數(shù),不具有多態(tài)的性質(zhì)。一種常用方法是把Instance()函數(shù)移到子類中,這時就只能用static Singleton *_instance,而不能用static Singleton _instance了,除非把_instance也要移到子類,無論怎么做都不優(yōu)雅。另一種方法是用模板。具體用什么方法,只能根據(jù)實際情況權(quán)衡。 五、示例代碼(1)沒子類的情況 namespace DesignPattern_Singletonclass Singletonpublic:static Singleton* Instanc

25、e() static Singleton _instance ; return &_instance ; protected:Singleton() private:Singleton(const Singleton&) ;Singleton& operator=(const Singleton&) ; ;客戶端代碼:using namespace DesignPattern_Singleton ;Singleton *p = Singleton:Instance() ;.(2)有子類的情況 方法一:namespace DesignPattern_Singlet

26、on/ class Singletonclass Singletonprotected:Singleton() static Singleton *_instance ;private:Singleton(const Singleton&) ;Singleton& operator=(const Singleton&) ; ;Singleton* Singleton:_instance = NULL ;/ class ConcreteSingletonclass ConcreteSingleton : public Singletonpublic:static Sing

27、leton* Instance() ;protected:ConcreteSingleton() ;Singleton* ConcreteSingleton:Instance()(_instance = NULL) ? _instance = new ConcreteSingleton() : 0 ; return _instance ;客戶端代碼:using namespace DesignPattern_Singleton ;Singleton *p = ConcreteSingleton:Instance() ;方法二:namespace DesignPattern_Singleton/

28、 class Singletonclass Singletonprotected:Singleton() private:Singleton(const Singleton&) ;Singleton& operator=(const Singleton&) ; ;/ class ConcreteSingletonclass ConcreteSingleton : public Singletonpublic:static Singleton* Instance() static ConcreteSingleton _instance ; return &_ins

29、tance ; protected:ConcreteSingleton() ;客戶端代碼:using namespace DesignPattern_Singleton ;Singleton *p = ConcreteSingleton:Instance() ;方法三:namespace DesignPattern_Singletontemplate < class T >class Singletonpublic:static T* Instance() static T _instance ; return &_instance ; protected:Singleto

30、n() private:Singleton(const Singleton &) ;Singleton& operator=(const Singleton&) ; ;class ConcreteSingleton : public Singleton< ConcreteSingleton > ;客戶端代碼using namespace DesignPattern_Singleton ;ConcreteSingleton *p = ConcreteSingleton:Instance() ; C+模式開發(fā)之Bridge 一、功能 將抽象部

31、分與它的實現(xiàn)部分分離,使它們都可以獨(dú)立地變化。 二、結(jié)構(gòu)圖 三、示例代碼 namespace DesignPattern_Bridge/ class Implementorclass Implementorpublic:virtual void OperationImp() = 0 ; ;/ class ConcreteImplementorAclass ConcreteImplementorA : public Implementorpublic:virtual void OperationImp() ;/ class ConcreteImplementorBclass Concr

32、eteImplementorB : public Implementorpublic:virtual void OperationImp() ;/ class Abstractionclass Abstractionpublic:void Operation(Implementor* imp) assert(imp) ; imp->OperationImp() ; ;客戶端代碼:using namespace DesignPattern_Bridge ;Abstraction obj ;Implementor *impa = new ConcreteImplementorA() ;Imp

33、lementor *impb = new ConcreteImplementorB() ;obj.Operation(impa) ; /第一種實現(xiàn)方法obj.Operation(impb) ; /第二種實現(xiàn)方法四、實例(1)創(chuàng)建可以在X Window System和IBM的Presentation Manager系統(tǒng)中都可以使用的窗口。(書上的例子) Bridge的魅力在于抽象和實現(xiàn)之間是松散的關(guān)系,它們之間可以進(jìn)行隨意組合。如上圖中,就有IconWindow+XWindowImp、TransientWindow+XWindowImp、IconWindow+PMWindowImp、Transi

34、entWindow+PMWindowImp四種組合。C+模式設(shè)計之Builder 2002-07-30· · ··COM集中營 一、功能 將一個復(fù)雜對象的構(gòu)建與它的表示分離,使得同樣的構(gòu)建過程可以創(chuàng)建不同的表示。 二、結(jié)構(gòu)圖各類之間的交互關(guān)系如下圖所示:  三、示例代碼 namespace DesignPattern_Builderclass Product1 /*.*/ ;class Product2 /*.*/ ;/ class Builderclass Builder /抽象基類public:virtual void Build

35、erPartA() /提供缺省實現(xiàn)virtual void BuilderPartB() virtual void BuilderPartC() protected:Builder() ;/ class ConcreteBuilder1class ConcreteBuilder1 : public Builder /創(chuàng)建Product1public:ConcreteBuilder1() : _product(NULL) virtual void BuilderPartA() /*.*/ virtual void BuilderPartB() /*.*/ virtual void Builder

36、PartC() /*.*/ virtual Product1* GetProduct1() return _product ; /返回創(chuàng)建的Product1對象private:Product1 *_product ; ;/ class ConcreteBuilder2class ConcreteBuilder2 : public Builder /創(chuàng)建Product2public:ConcreteBuilder2() : _product(NULL) virtual void BuilderPartA() /*.*/ virtual void BuilderPartB() /*.*/ virt

37、ual void BuilderPartC() /*.*/ virtual Product2* GetProduct2() return _product ; /返回創(chuàng)建的Product2對象private:Product2 *_product ; ;/ class Directorclass Directorpublic:/創(chuàng)建對象(Director并不知道具體創(chuàng)建出來的對象是什么樣的,只有調(diào)用該函數(shù)的client知道)void Construct(Builder *builder)builder->BuilderPartA() ;builder->BuilderPartB() ;builder->BuilderPartC() ; ;客戶端代碼:using namespace DesignPattern_Builder ;Director director ;/ 創(chuàng)建第一種對象ConcreteBuilder1 *pBuilder1 = new ConcreteBuilder1() ;direc

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論