收藏 分销(赏)

C++设计模式(核心板).doc

上传人:丰**** 文档编号:3635838 上传时间:2024-07-11 格式:DOC 页数:22 大小:107.84KB
下载 相关 举报
C++设计模式(核心板).doc_第1页
第1页 / 共22页
C++设计模式(核心板).doc_第2页
第2页 / 共22页
C++设计模式(核心板).doc_第3页
第3页 / 共22页
C++设计模式(核心板).doc_第4页
第4页 / 共22页
C++设计模式(核心板).doc_第5页
第5页 / 共22页
点击查看更多>>
资源描述

1、。C+设计模式一、功能 将一个类的接口转换成客户希望的另外一个接口,解决两个已有接口之间不匹配的问题。Adapter模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。 二、结构图(1)class adapter (2)object adapter 三、实现和其他很多模式一样,学习设计模式的重点是学习每种模式的思想,而不应拘泥于它的某种具体结构图和实现。因为模式是灵活的,其实现可以是千变万化的,只是所谓万变不离其宗。 在STL中大量运用了Adapter模式,象function adapter、iterator adpter,它们与这里说的adapter结构并不一样,但思想是一样的。具

2、体的介绍可到侯捷网站上找相关文章,他讲得非常好。 四、示例代码(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 void Request() SpecialRe

3、quest() ; ;客户端代码:using namespace DesignPattern_Adapter ;Target *p = new Adapter() ;p-Request() ; /实际上调用的是Adaptee:SpecialRequest()(2)object adapter namespace DesignPattern_Adapter/ class Adapteeclass Adapteepublic:void SpecialRequest() ;/ class Targetclass Targetpublic:virtual void Request() = 0 ; ;/

4、 class Adapterclass Adapter : public Targetpublic:virtual void Request() _adaptee.SpecialRequest() ; private:Adaptee _adaptee ; ;客户端代码:using namespace DesignPattern_Adapter ;Target *p = new Adapter() ;p-Request() ; /实际上调用的是Adaptee:SpecialRequest()六、实例(1)STL中的Class Adapter STL中的Adapter Class包括:a.stac

5、k(对应的adaptee是deque)。b.queue(对应的adaptee是deque)。c.priority_queue(对应的adaptee是vector)。 下面是从VC中的拷出的stack的类定义: templateclass _Container = deque class stack / LIFO queue implemented with a containerpublic:typedef _Container container_type;typedef typename _Container:value_type value_type;typedef typename _

6、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_type size() const / test length of stackreturn (c.size();value_type

7、& 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(_Val);void pop() / erase last elementc.pop_back();bool _Eq(const stack& _Right)

8、const / test for stack equalityreturn (c = _Right.c);bool _Lt(const stack& _Right) const / test if this _Right for stacksreturn (c _Right.c);protected:_Container c; / the underlying container;关键之处在于_Container c,stack所有的操作都转交给c去处理了。(这实际上就是前面所说的object adapter,注意STL中的class adapter与上面所说的class adapter概念不

9、完全一致) stack的使用方法很简单,如下: int ia = 1,3,2,4 ;deque id(ia, ia+4);stack is(id);(2)近日看了一篇文章“Generic:简化异常安全代码”,原文出自 中文译文出自C+ View第5期。 文章绝对一流,作者给出的代码中也使用了Adaptor模式,也有一定代表性。我将其问题一般化,概括出以下示例: 问题:假设有几个已有类,他们有某些共同的行为,但它们彼此间是独立的(没有共同的基类)。如: class T1public:void Proc() ;class T2public:void Proc() ;/ .如何以统一的方式去调用这些

10、行为呢? 解决方法1:很自然的会想到用模板,如: template void Test(T t)t.Proc() ; 的确不错,但这只适用于简单的情况,有时情况是很复杂的,比如我们无法把类型放到模板参数中! 解决方法2:困难来自于这些类没有共同的基类,所以我们就创造一个基类,然后再Adapt。 / class IAdaptor,抽象基类class IAdaptorpublic:virtual void Proc() = 0 ; ; / class Adaptortemplate class Adaptor : public IAdaptor, private T /实现继承public:vir

11、tual 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 T1public:T1(int) /*.*/ void Proc() /*.*/ ;class T2public:T2(ch

12、ar) /*.*/ void Proc() /*.*/ ;/ class IAdaptor,抽象基类class IAdaptorpublic:virtual void Proc() = 0 ; ;/ class Adaptortemplate class Adaptor : public IAdaptor, private T /实现继承public:Adaptor(int n) : T(n) Adaptor(char c) : T(c) virtual void Proc() T:Proc() ; ;class Testpublic:Test(int n) : sp(new Adaptor(

13、n) Test(char c) : sp(new Adaptor(c) void Proc() sp-Proc() ; private:std:auto_ptr sp ; ;客户端代码:Test t1(10) ;t1.Proc() ;Test t2(c) ;t2.Proc() ;上面是示例而非实例,你也许更愿意看看它实际的运用。去下载作者所写的代码,好好欣赏一下吧。C+设计模式之Abstract Factory一、功能 提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。 二、结构图类厂最基本的结构示意图如下: 在实际应用中,类厂模式可以扩充到很复杂的情况,如下图所示: 三、优

14、缺点优点:(1)封装创建过程。客户不用知道类厂是如何创建类实例的,类厂封闭了所有创建的细节。这样可选择不同的创建方法,增加了灵活性。 (2)将客户与具体类隔离,提高了各自的可重用性。 缺点:Factory类层次与具体类层次通常是平行的(即一一对应的)。增加一个具体类,一般也要相应地增加一个factory类,增加了系统复杂度。 四、实现(1)Abstract Factory类中通常是一组Factory Method的集合。个人认为与Factory Method模式没有本质区别。 (2)通常可以把工厂作为单件。 五、示例代码namespace DesignPattern_AbstractFacto

15、ryclass AbstractProductA ; / Product Aclass ProductA1 : public AbstractProductA ;class ProductA2 : public AbstractProductA ;class AbstractProductB ; / Product Bclass ProductB1 : public AbstractProductB ;class ProductB2 : public AbstractProductB ;class AbstractFactorypublic:virtual AbstractProductA*

16、CreateProductA() = 0 ;/ 创建ProductAvirtual AbstractProductB* CreateProductB() = 0 ;/ 创建ProductB ;class ConcreteFactory1 : public AbstractFactorypublic:virtual AbstractProductA* CreateProductA() return new ProductA1() ; virtual AbstractProductB* CreateProductB() return new ProductB1() ; static Concret

17、eFactory1* Instance() static ConcreteFactory1 instance ; return &instance ; protected:ConcreteFactory1() private:ConcreteFactory1(const ConcreteFactory1&) ;ConcreteFactory1& operator=(const ConcreteFactory1&) ; ;class ConcreteFactory2 : public AbstractFactorypublic:virtual AbstractProductA* CreatePr

18、oductA() return new ProductA2() ; virtual AbstractProductB* CreateProductB() return new ProductB2() ; static ConcreteFactory2* Instance() static ConcreteFactory2 instance ; return &instance ; protected:ConcreteFactory2() private:ConcreteFactory2(const ConcreteFactory2&) ;ConcreteFactory2& operator=(

19、const ConcreteFactory2&) ; ;客户端代码:using namespace DesignPattern_AbstractFactory ;/ 第一种创建方法AbstractFactory *pFactory = ConcreteFactory1:Instance() ;AbstractProductA *pProductA = pFactory-CreateProductA() ;AbstractProductB *pProductB = pFactory-CreateProductB() ;/ 第二种创建方法pFactory = ConcreteFactory2:In

20、stance() ;pProductA = pFactory-CreateProductA() ;pProductB = pFactory-CreateProductB() ; 六、实例最早知道类厂的概念是在COM中,但当时也没想到这是如此重要的一种模式,在许多其他模式中都可以用到类厂模式。 COM中不能直接创建组件,这也是由COM的一个特性决定的:即客户不知道要创建的组件的类名。C+设计模式之Singleton一、功能 保证一个类仅有一个实例。 二、结构图三、优缺点Singleton模式是做为全局变量的替代品出现的。所以它具有全局变量的特点:全局可见、贯穿应用程序的整个生命期,它也具有全局变

21、量不具备的性质:同类型的对象实例只可能有一个。 四、实现教科书上的Singleton定义如下: class Singletonpublic:static Singleton* Instance() ;protected:Singleton() private:static Singleton *_instance ;Singleton(const Singleton&) ;Singleton& operator=(const Singleton&) ; ;Singleton* Singleton:_instance = NULL ;Singleton* Singleton:Instance()

22、(_instance = NULL) ? _instance = new Singleton() : 0 ; /lazy initializationreturn _instance ;(1)因为返回的是指针,为防止用户调用delete函数,可把static Singleton *_instance;改为在Instance()中定义static Singleton _instance。这样显然更安全,同时也具有lazy initialization的特性(即第一次访问时才创建)。 (2)假设需要从Singleton派生子类,而子类也需要有同样的性质,既只能创建一个实例。我觉得,这很难办。根本原

23、因在于Instance()函数不是虚函数,不具有多态的性质。一种常用方法是把Instance()函数移到子类中,这时就只能用static Singleton *_instance,而不能用static Singleton _instance了,除非把_instance也要移到子类,无论怎么做都不优雅。另一种方法是用模板。具体用什么方法,只能根据实际情况权衡。 五、示例代码(1)没子类的情况 namespace DesignPattern_Singletonclass Singletonpublic:static Singleton* Instance() static Singleton _i

24、nstance ; return &_instance ; protected:Singleton() private:Singleton(const Singleton&) ;Singleton& operator=(const Singleton&) ; ;客户端代码:using namespace DesignPattern_Singleton ;Singleton *p = Singleton:Instance() ;.(2)有子类的情况 方法一:namespace DesignPattern_Singleton/ class Singletonclass Singletonprote

25、cted:Singleton() static Singleton *_instance ;private:Singleton(const Singleton&) ;Singleton& operator=(const Singleton&) ; ;Singleton* Singleton:_instance = NULL ;/ class ConcreteSingletonclass ConcreteSingleton : public Singletonpublic:static Singleton* Instance() ;protected:ConcreteSingleton() ;S

26、ingleton* ConcreteSingleton:Instance()(_instance = NULL) ? _instance = new ConcreteSingleton() : 0 ; return _instance ;客户端代码:using namespace DesignPattern_Singleton ;Singleton *p = ConcreteSingleton:Instance() ;方法二:namespace DesignPattern_Singleton/ class Singletonclass Singletonprotected:Singleton(

27、) private:Singleton(const Singleton&) ;Singleton& operator=(const Singleton&) ; ;/ class ConcreteSingletonclass ConcreteSingleton : public Singletonpublic:static Singleton* Instance() static ConcreteSingleton _instance ; return &_instance ; protected:ConcreteSingleton() ;客户端代码:using namespace Design

28、Pattern_Singleton ;Singleton *p = ConcreteSingleton:Instance() ;方法三:namespace DesignPattern_Singletontemplate class Singletonpublic:static T* Instance() static T _instance ; return &_instance ; protected:Singleton() private:Singleton(const Singleton &) ;Singleton& operator=(const Singleton&) ; ;clas

29、s ConcreteSingleton : public Singleton ;客户端代码using namespace DesignPattern_Singleton ;ConcreteSingleton *p = ConcreteSingleton:Instance() ;C+模式开发之Bridge一、功能 将抽象部分与它的实现部分分离,使它们都可以独立地变化。 二、结构图三、示例代码 namespace DesignPattern_Bridge/ class Implementorclass Implementorpublic:virtual void OperationImp() =

30、0 ; ;/ class ConcreteImplementorAclass ConcreteImplementorA : public Implementorpublic:virtual void OperationImp() ;/ class ConcreteImplementorBclass ConcreteImplementorB : public Implementorpublic:virtual void OperationImp() ;/ class Abstractionclass Abstractionpublic:void Operation(Implementor* im

31、p) assert(imp) ; imp-OperationImp() ; ;客户端代码:using namespace DesignPattern_Bridge ;Abstraction obj ;Implementor *impa = new ConcreteImplementorA() ;Implementor *impb = new ConcreteImplementorB() ;obj.Operation(impa) ; /第一种实现方法obj.Operation(impb) ; /第二种实现方法四、实例(1)创建可以在X Window System和IBM的Presentation

32、 Manager系统中都可以使用的窗口。(书上的例子) Bridge的魅力在于抽象和实现之间是松散的关系,它们之间可以进行随意组合。如上图中,就有IconWindow+XWindowImp、TransientWindow+XWindowImp、IconWindow+PMWindowImp、TransientWindow+PMWindowImp四种组合。C+模式设计之Builder2002-07-30 COM集中营 一、功能 将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。 二、结构图各类之间的交互关系如下图所示: 三、示例代码 namespace DesignPatt

33、ern_Builderclass Product1 /*.*/ ;class Product2 /*.*/ ;/ class Builderclass Builder /抽象基类public:virtual void BuilderPartA() /提供缺省实现virtual void BuilderPartB() virtual void BuilderPartC() protected:Builder() ;/ class ConcreteBuilder1class ConcreteBuilder1 : public Builder /创建Product1public:ConcreteBu

34、ilder1() : _product(NULL) virtual void BuilderPartA() /*.*/ virtual void BuilderPartB() /*.*/ virtual void BuilderPartC() /*.*/ virtual Product1* GetProduct1() return _product ; /返回创建的Product1对象private:Product1 *_product ; ;/ class ConcreteBuilder2class ConcreteBuilder2 : public Builder /创建Product2p

35、ublic:ConcreteBuilder2() : _product(NULL) virtual void BuilderPartA() /*.*/ virtual void BuilderPartB() /*.*/ virtual void BuilderPartC() /*.*/ virtual Product2* GetProduct2() return _product ; /返回创建的Product2对象private:Product2 *_product ; ;/ class Directorclass Directorpublic:/创建对象(Director并不知道具体创建出

36、来的对象是什么样的,只有调用该函数的client知道)void Construct(Builder *builder)builder-BuilderPartA() ;builder-BuilderPartB() ;builder-BuilderPartC() ; ;客户端代码:using namespace DesignPattern_Builder ;Director director ;/ 创建第一种对象ConcreteBuilder1 *pBuilder1 = new ConcreteBuilder1() ;director.Construct(pBuilder1) ;Product1

37、*product1 = pBuilder1-GetProduct1() ;/ 创建第二种对象ConcreteBuilder2 *pBuilder2 = new ConcreteBuilder2() ;director.Construct(pBuilder2) ;Product2 *product2 = pBuilder2-GetProduct2() ;四、实例(1)例子一。如下图所示: 上图的功能是是把一个RTF文件转换为多种正文格式。RTFReader进行语法分析,然后将所有的token串逐一转换。可见builder就是一步步地把各个部分组装为一个整体。它封闭了组装的方法,组装出来的对象也大

38、相径庭。C+设计模式之Prototype一、功能 用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。二、结构图三、优缺点优点:复制自身。客户不知道需要对象的实际类型,只需知道它的抽象基类即可。(即有继承树的情况) 缺点:必须先有一个对象实例(即原型)才能clone。 四、示例代码namespace DesignPattern_Prototype/ class Prototypeclass Prototype /抽象基类public:virtual Prototype* Clone() = 0 ; ;/ class ConcretePrototype1class ConcreteP

39、rototype1 : public Prototypepublic:virtual Prototype* Clone()ConcretePrototype1 *p = new ConcretePrototype1() ;*p = *this ; /复制对象return p ; ;/ class ConcretePrototype2class ConcretePrototype2 : public Prototypepublic:virtual Prototype* Clone()ConcretePrototype2 *p = new ConcretePrototype2() ;*p = *t

40、his ; /复制对象return p ; ;客户端代码:using namespace DesignPattern_Prototype ;ConcretePrototype1 *obj1 = new ConcretePrototype1() ;/原型对象1ConcretePrototype2 *obj2 = new ConcretePrototype2() ;/原型对象2Prototype *newobj1 = obj1-Clone() ;/克隆对象1Prototype *newobj2 = obj2-Clone() ;/克隆对象2/使用复制出的对象newobj1和newobj2THANKS !致力为企业和个人提供合同协议,策划案计划书,学习课件等等打造全网一站式需求欢迎您的下载,资料仅供参考-可编辑修改-

展开阅读全文
相似文档                                   自信AI助手自信AI助手
猜你喜欢                                   自信AI导航自信AI导航
搜索标签

当前位置:首页 > 通信科技 > 开发语言

移动网页_全站_页脚广告1

关于我们      便捷服务       自信AI       AI导航        获赠5币

©2010-2024 宁波自信网络信息技术有限公司  版权所有

客服电话:4008-655-100  投诉/维权电话:4009-655-100

gongan.png浙公网安备33021202000488号   

icp.png浙ICP备2021020529号-1  |  浙B2-20240490  

关注我们 :gzh.png    weibo.png    LOFTER.png 

客服