




已阅读5页,还剩28页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
这里,对设计模式的概念就不细说了,凡是用过或者看过这方面书籍的都应该有所了解。鄙人认为正是设计模式的出现,使得C+的三大性质封装、继承和多态发挥的淋漓尽致。尤其是多态性质,可以说是面向对的精髓所在。封装性是为了很好的管理数据和方法;继承是为了提高代码的重用;而多态的出现,使得执行过程中,出现多样性,调用一个方法时,可以从父类跳到子类执行,又从子类调用父类的方法等等,函数调用过程呈现曲线形式。总之,执行期,表现出多样化。所以,要想很好的掌握设计模式,必须对多态性有很深的了解,再则,对类与类之间的关系有个清晰的认识,类与类之间的关系,无非6大关系继承和实现、依赖和关联、组合和聚合。每个模式都是对类之间的这6种关系进行组合,呈现出不同的表现形式,下面,一一介绍23种设计模式,用到的类之间的关系和C+代码(在VS2008调试没问题的)。先说创建型模式:1、Factory Pattern 工厂模式使用到的类关系:继承和依赖图 1 工厂模式UML图Head.h#ifndef _FACTORY_HEAD_#define _FACTORY_HEAD_#include using std:cout;using std:endl;class CProduct;class CFactoryprivate:public:CFactory()CFactory()public:virtual CProduct* CreateProduct() = 0;class CConcreteFactory : public CFactoryprivate:public:CConcreteFactory();CConcreteFactory();public:virtual CProduct* CreateProduct();class CProductprivate:public:CProduct()CProduct()public:virtual void Operation()=0;class CConcreteProduct1 : public CProductprivate:public:CConcreteProduct1();CConcreteProduct1();public:virtual void Operation();class CConcreteProduct2 : public CProductprivate:public:CConcreteProduct2();CConcreteProduct2();public:virtual void Operation();#endifMain.cpp#include Head.hCConcreteFactory:CConcreteFactory()CConcreteFactory:CConcreteFactory()CProduct* CConcreteFactory:CreateProduct()return new CConcreteProduct2();/CConcreteProduct1:CConcreteProduct1()CConcreteProduct1:CConcreteProduct1()void CConcreteProduct1:Operation()coutCConcreteProduct1 Operation!endl;/CConcreteProduct2:CConcreteProduct2()CConcreteProduct2:CConcreteProduct2()void CConcreteProduct2:Operation()coutCConcreteProduct2 Operation!CreateProduct();if (pPro != NULL)pPro-Operation();delete pPro;delete pFac;return 0;2、AbstractFactory Pattern 抽象工厂模式使用到的类关系:继承和依赖图2 抽象工厂模式Head.h#ifndef _ABSTRACT_FACTORY_HEAD_#define _ABSTRACT_FACTORY_HEAD_#include using std:cout;using std:endl;class CProductA;class CProductB;class CAbstractFactoryprivate:public:CAbstractFactory()CAbstractFactory()public:virtual CProductA* CreateProductA() = 0;virtual CProductB* CreateProductB() = 0;class CConcreteAbstractFactory1 : public CAbstractFactoryprivate:public:CConcreteAbstractFactory1();CConcreteAbstractFactory1();public:virtual CProductA* CreateProductA();virtual CProductB* CreateProductB();class CConcreteAbstractFactory2 : public CAbstractFactoryprivate:public:CConcreteAbstractFactory2();CConcreteAbstractFactory2();public:virtual CProductA* CreateProductA();virtual CProductB* CreateProductB();class CProductAprivate:public:CProductA()CProductA()public:virtual void Operation()=0;class CConcreteProductA1 : public CProductAprivate:public:CConcreteProductA1();CConcreteProductA1();public:virtual void Operation();class CConcreteProductA2 : public CProductAprivate:public:CConcreteProductA2();CConcreteProductA2();public:virtual void Operation();class CProductBprivate:public:CProductB()CProductB()public:virtual void Operation()=0;class CConcreteProductB1 : public CProductBprivate:public:CConcreteProductB1();CConcreteProductB1();public:virtual void Operation();class CConcreteProductB2 : public CProductBprivate:public:CConcreteProductB2();CConcreteProductB2();public:virtual void Operation();#endifMain.cpp#include Head.hCConcreteAbstractFactory1:CConcreteAbstractFactory1()CConcreteAbstractFactory1:CConcreteAbstractFactory1()CProductA* CConcreteAbstractFactory1:CreateProductA()return new CConcreteProductA1();CProductB* CConcreteAbstractFactory1:CreateProductB()return new CConcreteProductB1();/CConcreteAbstractFactory2/CConcreteAbstractFactory2:CConcreteAbstractFactory2()CConcreteAbstractFactory2:CConcreteAbstractFactory2()CProductA* CConcreteAbstractFactory2:CreateProductA()return new CConcreteProductA2();CProductB* CConcreteAbstractFactory2:CreateProductB()return new CConcreteProductB2();/CConcreteProductA1/CConcreteProductA1:CConcreteProductA1()CConcreteProductA1:CConcreteProductA1()void CConcreteProductA1:Operation()coutCConcreteProductA1 Operation!endl;/CConcreteProductA2/CConcreteProductA2:CConcreteProductA2()CConcreteProductA2:CConcreteProductA2()void CConcreteProductA2:Operation()coutCConcreteProductA2 Operation!endl;/CConcreteProductB1/CConcreteProductB1:CConcreteProductB1()CConcreteProductB1:CConcreteProductB1()void CConcreteProductB1:Operation()coutCConcreteProductB1 Operation!endl;/CConcreteProductB2/CConcreteProductB2:CConcreteProductB2()CConcreteProductB2:CConcreteProductB2()void CConcreteProductB2:Operation()coutCConcreteProductB2 Operation!CreateProductA();if (pProA1 != NULL)pProA1-Operation();CProductB* pProB1 = pFac-CreateProductB();if (pProB1 != NULL)pProB1-Operation();delete pProA1;delete pProB1;delete pFac;return 0;3、单例模式使用到的类关系:无单例模式很简单,目的就是只创建一个实例,关键是他的构造函数私有的,所以在外部是不能被调用的,只能使用自己的实例化函数进行构造,而实例化函数中,保证了只创建一个实例,下次在调用,如果判断已经创建了一个实例,则只返回已创建的实例,详看程序。图3 单例模式Head.h#ifndef _SINGLETON_HEAD_#define _SINGLETON_HEAD_#include using std:cout;using std:endl;class CSingletonprivate:static CSingleton* m_pSelf;private:CSingleton() / 把构造函数访问权限设置为private, 使得外部不能访问public:CSingleton();public:static CSingleton* Instance(); / 实例化函数void Operation();#endifMain.cpp#include Head.hCSingleton* CSingleton:m_pSelf = NULL;CSingleton:CSingleton()if (m_pSelf != NULL)delete m_pSelf;m_pSelf = NULL;CSingleton* CSingleton:Instance()if (NULL = m_pSelf)m_pSelf = new CSingleton(); / 只有在类内部才能调用构造函数return m_pSelf;void CSingleton:Operation()coutthe Address is thisOperation();CSingleton* pS1 = CSingleton:Instance();if (NULL != pS1)pS1-Operation();return 0;4、Builder Pattern 建造者模式使用到的类关系:组合、继承和依赖图4 建造者模式Head.h#ifndef _BUILDER_HEAD_#define _BUILDER_HEAD_#include #include using std:string;using std:cout;using std:endl;class CProduct;class CBuilder;class CDirectorprivate:CBuilder* m_pBuilder;public:CDirector(CBuilder* pBuilder);CDirector();void ConstructProduct();class CBuilderprivate:public:CBuilder()CBuilder()public:virtual void BuildPartA(const string& strA)=0;virtual void BuildPartB(const string& strB)=0;virtual void BuildPartC(const string& strC)=0;virtual CProduct* GetProduct() = 0;class CConcreteBuilder : public CBuilderprivate:public:CConcreteBuilder();CConcreteBuilder();public:virtual void BuildPartA(const string& strA);virtual void BuildPartB(const string& strB);virtual void BuildPartC(const string& strC);virtual CProduct* GetProduct();class CProductprivate:public:CProduct()CProduct()public:void Operation();#endifMain.cpp#include Head.hCDirector:CDirector(CBuilder* pBuilder)m_pBuilder = pBuilder;CDirector:CDirector()if (m_pBuilder != NULL)delete m_pBuilder;m_pBuilder = NULL;void CDirector:ConstructProduct()CProduct* pPro = NULL;if (m_pBuilder != NULL)pPro = m_pBuilder-GetProduct();if (pPro != NULL)pPro-Operation();delete pPro;pPro = NULL;CConcreteBuilder:CConcreteBuilder()CConcreteBuilder:CConcreteBuilder()void CConcreteBuilder:BuildPartA(const string& strA)coutstrAendl;void CConcreteBuilder:BuildPartB(const string& strB)coutstrBendl;void CConcreteBuilder:BuildPartC(const string& strC)coutstrCendl;CProduct* CConcreteBuilder:GetProduct()BuildPartA(hong);BuildPartB(ji);BuildPartC(hai);return new CProduct();void CProduct:Operation()coutCProduct OperationConstructProduct();delete pDir;pDir = NULL;return 0;5、prototype 原型模式创建型模式的最后一个,其实原型模式的目的很简单,就是克隆一个已有的对象,所以其作用和拷贝构造函数相似.使用到的类关系:继承图5 原型模式Head.h#ifndef _PROTOTYPE_HEAD_#define _PROTOTYPE_HEAD_#include using std:cout;using std:endl;class CPrototypeprivate:public:CPrototype()CPrototype()public:virtual CPrototype* Clone()const = 0;virtual void Operation()const=0;class CConcretePrototype: public CPrototypeprivate:public:CConcretePrototype()CConcretePrototype(const CConcretePrototype& self);CConcretePrototype()public:virtual CPrototype* Clone()const;public:void Operation()const;#endifMain.cpp#include Head.hCConcretePrototype:CConcretePrototype(const CConcretePrototype& self)/ 如果有成员变量,进行复制操作,注意深度拷贝CPrototype* CConcretePrototype:Clone()constreturn new CConcretePrototype(*this);void CConcretePrototype:Operation()constcoutCConcretePrototype OperationClone();if (pClone != NULL)pClone-Operation();delete pInstance;pInstance = NULL;delete pClone; / 注意,pClone也需要释放,否则有内存泄露pClone = NULL;return 0;创建型模式,一共5个,到此完毕下面进行结构行模式的C+模仿6、Bridge Pattern 桥接模式桥接模式是实际编程中应用的比较多的一个模式,其目的是将抽象与实现进行分离。使用到的类关系:继承与组合图 6 桥接模式Head.h#ifndef _BRIDGE_HEAD_#define _BRIDGE_HEAD_#include using std:cout;using std:endl;class CProductImp;/ 注意,这里有一个纯虚函数,但是该类还可以包含成员变量,这是正确的,一个类有纯虚函数,/ 只是说明该类不能被实例化,但是它还是可以包含成员变量,然后对其子类进行实例化,父类的/ 这些成员变量是可以使用的class CProductprotected:CProductImp* m_pImpProduct;public:CProduct(CProductImp* pImpPrd);CProduct();public:virtual void Operation() = 0;class CConcreteProduct : public CProductprivate:public:CConcreteProduct(CProductImp* pImpPrd);CConcreteProduct();public:virtual void Operation();class CProductImpprivate:public:CProductImp()CProductImp()public:virtual void Operation()=0;class CConcreteProductImp1 : public CProductImpprivate:public:CConcreteProductImp1()CConcreteProductImp1()public:virtual void Operation();class CConcreteProductImp2 : public CProductImpprivate:public:CConcreteProductImp2()CConcreteProductImp2()public:virtual void Operation();#endifMain.cpp#include Head.hCProduct:CProduct(CProductImp* pImpPrd)m_pImpProduct = pImpPrd;CProduct:CProduct()if (NULL != m_pImpProduct)delete m_pImpProduct;m_pImpProduct = NULL;CConcreteProduct:CConcreteProduct(CProductImp* pImpPrd):CProduct(pImpPrd)CConcreteProduct:CConcreteProduct()void CConcreteProduct:Operation()if (m_pImpProduct != NULL)m_pImpProduct-Operation();void CConcreteProductImp1:Operation()coutCConcreteProductImp1 Operationendl;void CConcreteProductImp2:Operation()coutCConcreteProductImp2 OperationOperation();delete pProduct;pProduct = NULL;return 0;7、Adapter Pattern 适配器模式目的:使用第三方库时,不用修改自己的调用接口使用到的类关系:继承与关联图7 适配器模式Head.h#ifndef _APAPTER_HEAD_#define _APAPTER_HEAD_#include using std:cout;using std:endl;class CAdaptee; / 第三方库class CTargetprivate:public:CTarget()CTarget()public:virtual void Request() = 0;class CAdapter : public CTargetprivate:CAdaptee* m_pAdaptee;public:CAdapter(CAdaptee* pAdaptee);CAdapter();public:virtual void Request();class CAdapteeprivate:public:CAdaptee()CAdaptee()public:void SpecificRequest();#endifMain.cpp#include Head.hCAdapter:CAdapter(CAdaptee* pAdaptee)m_pAdaptee = pAdaptee;CAdapter:CAdapter()if (m_pAdaptee != NULL)delete m_pAdaptee;m_pAdaptee = NULL;void CAdapter:Request()if (m_pAdaptee != NULL)m_pAdaptee-SpecificRequest();void CAdaptee:SpecificRequest()coutCAdaptee SpecificRequestRequest();delete pTarget;pTarget = NULL;return 0;-华-丽-的-分-割-线-2014/08/02(七夕)未完待续8、Decorator Pattern 装饰者模式使用到的类关系:继承与组合图8 装饰者模式Head.h#ifndef _DECORATOR_HEAD_#define _DECORATOR_HEAD_#include using std:cout;using std:endl;class CComponentprivate:public:CComponent()CComponent()public:virtual void Operation();class CConcreteComponent : public CComponentprivate:public:CConcreteComponent()CConcreteComponent()public:virtual void Operation();class CDecorator : public CComponentprotected:CComponent* m_pCom;public:CDecorator(CComponent* pCom);CDecorator();public:virtual void Operation()=0;class CConcreteDecorator : public CDecoratorprivate:public:CConcreteDecorator(CComponent* pCom);CConcreteDecorator();public:virtual void Operation();void AddedBehavior();#endifMain.cpp#include Head.hvoid CComponent:Operation()coutCComponent Operationendl;void CConcreteComponent:Operation()coutCConcreteComponent OperationOperation();coutCConcreteDecorator Operationendl;AddedBehavior();void CConcreteDecorator:AddedBehavior()coutCConcreteDecorator AddedBehaviorOperation();delete pDec;pDec = NULL;return 0;9、Composite Pattern组合模式图9 组合模式目的:当结构中用到递归的树形结构时使用使用到的类关系:继承与组合(与装饰有相似之处)组合模式也是一个比较复杂的模式,要细细研究代码Head.h#ifndef _COMPOSITE_HEAD_#define _COMPOSITE_HEAD_#include #include #include using std:cout;using std:endl;using std:vector;using std:string;class CComponentprivate:public:CComponent()CComponent()public:virtual void Operation()=0;virtual void Add(CComponent* pCom)virtual void Remove(const int& nIndex)virtual CComponent* GetChild(const int& nIndex)return NULL;class CLeaf : public CComponentprivate:public:CLeaf()CLeaf()public:virtual void Operation();class CComposite : public CComponentprotected:vector m_arrCom;public:CComposite();CComposite();public:virtual void Operation();virtual void Add(CComponent* pCom);virtual void Remove(const int& nIndex);virtual CComponent* GetChild(const int& nIndex);#endifMain.cpp#include Head.hvoid CLeaf:Operation()coutCLeaf:Operationendl;CComposite:CComposite()m_arrCom.clear();CComposite:CComposite()for (int i = 0; i m_arrCom.size(); i+)CComponent* pCur = m_arrComi;if (pCur != NULL)delete pCur;pCur = NULL;m_arrCom.clear();void CComposite:Operation()coutCComposite:Operationendl;vector:iterator it = m_arrCom.begin();for (; it != m_arrCom.end(); it+)CComponent* pCur = *it;if (pCur = NULL)continue;pCur-Operation();void CComposite:Add(CComponent* pCom)m_arrCom.push_back(pCom);void CComposite:Remove(const int& nIndex)if (nIndex 0)return;vector:iterator it = m_arrCom.begin();int i = 0;for (; it != m_arrCom.end(); it+)CComponent* pCur = *it;if (pCur = NULL)i+;continue;if (i = nIndex)break;i+;m_arrCom.erase(it);CComponent* CComposite:Ge
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 北京市昌平区2024-2025学年八年级下学期第二次月考历史题目及答案
- 家庭农场生产安全责任合同书
- 早期阅读想飞的小象课件
- 品牌授权经销合作协议条款说明
- 早教培训知识课件
- 语文古诗词意境美欣赏与表达教学计划
- 纪念40周年课件
- 宁夏13年中考数学试卷
- 尼西县小升初数学试卷
- 2024年雅安天全县中医医院招聘笔试真题
- 2025-2030全球及中国ITSM工具行业市场现状供需分析及市场深度研究发展前景及规划可行性分析研究报告
- 心血管疾病急救知识课件
- 航运基础知识考试题库单选题100道及答案
- 高一新生入学教育
- 医院培训课件:《十八项核心医疗制度解读》
- 课题申报书:英语单元整体教学设计与实施研究
- 2024中国演播室市场运行态势及行业发展前景预测报告
- LY/T 3408-2024林下经济术语
- 肾内科医生进修总结汇报
- 小学数学跨学科学习案例
- 无人机驾照考证知识题
评论
0/150
提交评论