![点击分享此内容可以赚币 分享](/master/images/share_but.png)
C++设计模式(核心板).doc
《C++设计模式(核心板).doc》由会员分享,可在线阅读,更多相关《C++设计模式(核心板).doc(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模式是做为全局变量的替代品出现的。所以它具有全局变量的特点:全局可见、贯穿应用程序的整个生命期,它也具有全局变
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- C+ 设计 模式 核心
![提示](https://www.zixin.com.cn/images/bang_tan.gif)
1、咨信平台为文档C2C交易模式,即用户上传的文档直接被用户下载,收益归上传人(含作者)所有;本站仅是提供信息存储空间和展示预览,仅对用户上传内容的表现方式做保护处理,对上载内容不做任何修改或编辑。所展示的作品文档包括内容和图片全部来源于网络用户和作者上传投稿,我们不确定上传用户享有完全著作权,根据《信息网络传播权保护条例》,如果侵犯了您的版权、权益或隐私,请联系我们,核实后会尽快下架及时删除,并可随时和客服了解处理情况,尊重保护知识产权我们共同努力。
2、文档的总页数、文档格式和文档大小以系统显示为准(内容中显示的页数不一定正确),网站客服只以系统显示的页数、文件格式、文档大小作为仲裁依据,平台无法对文档的真实性、完整性、权威性、准确性、专业性及其观点立场做任何保证或承诺,下载前须认真查看,确认无误后再购买,务必慎重购买;若有违法违纪将进行移交司法处理,若涉侵权平台将进行基本处罚并下架。
3、本站所有内容均由用户上传,付费前请自行鉴别,如您付费,意味着您已接受本站规则且自行承担风险,本站不进行额外附加服务,虚拟产品一经售出概不退款(未进行购买下载可退充值款),文档一经付费(服务费)、不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
4、如你看到网页展示的文档有www.zixin.com.cn水印,是因预览和防盗链等技术需要对页面进行转换压缩成图而已,我们并不对上传的文档进行任何编辑或修改,文档下载后都不会有水印标识(原文档上传前个别存留的除外),下载后原文更清晰;试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓;PPT和DOC文档可被视为“模板”,允许上传人保留章节、目录结构的情况下删减部份的内容;PDF文档不管是原文档转换或图片扫描而得,本站不作要求视为允许,下载前自行私信或留言给上传者【丰****】。
5、本文档所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用;网站提供的党政主题相关内容(国旗、国徽、党徽--等)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
6、文档遇到问题,请及时私信或留言给本站上传会员【丰****】,需本站解决可联系【 微信客服】、【 QQ客服】,若有其他问题请点击或扫码反馈【 服务填表】;文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“【 版权申诉】”(推荐),意见反馈和侵权处理邮箱:1219186828@qq.com;也可以拔打客服电话:4008-655-100;投诉/维权电话:4009-655-100。