设计模式C++实现(4)——原型模式、模板方法模式

软件领域中的设计模式为开发人员提供了一种使用专家设计经验的有效途径。设计模式中运用了面向对象编程语言的重要特性:封装、继承、多态,真正领悟设计模式的精髓是可能一个漫长的过程,需要大量实践经验的积累。最近看设计模式的书,对于每个模式,用C++写了个小例子,加深一下理解。主要参考《大话设计模式》和《设计模式:可复用面向对象软件的基础》(DP)两本书。本文介绍原型模式和模板方法模式的实现。首先介绍原型模式,然后引出模板方法模式。

       DP书上的定义为:用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。其中有一个词很重要,那就是拷贝。可以说,拷贝是原型模式的精髓所在。举个现实中的例子来介绍原型模式。找工作的时候,我们需要准备简历。假设没有打印设备,因此需手写简历,这些简历的内容都是一样的。这样有个缺陷,如果要修改简历中的某项,那么所有已写好的简历都要修改,工作量很大。随着科技的进步,出现了打印设备。我们只需手写一份,然后利用打印设备复印多份即可。如果要修改简历中的某项,那么修改原始的版本就可以了,然后再复印。原始的那份手写稿相当于是一个原型,有了它,就可以通过复印(拷贝)创造出更多的新简历。这就是原型模式的基本思想。下面给出原型模式的UML图,以刚才那个例子为实例。


        原型模式实现的关键就是实现Clone函数,对于C++来说,其实就是拷贝构造函数,需实现深拷贝,下面给出一种实现。

[cpp] view plaincopyprint?
  1. //父类  
  2. class Resume  
  3. {  
  4. protected:  
  5.     char *name;  
  6. public:  
  7.     Resume() {}  
  8.     virtual ~Resume() {}  
  9.     virtual Resume* Clone() { return NULL; }  
  10.     virtual void Set(char *n) {}  
  11.     virtual void Show() {}  
  12. };  
[cpp] view plaincopyprint?
  1. class ResumeA : public Resume  
  2. {  
  3. public:  
  4.     ResumeA(const char *str);  //构造函数  
  5.     ResumeA(const ResumeA &r); //拷贝构造函数  
  6.     ~ResumeA();                //析构函数  
  7.     ResumeA* Clone();          //克隆,关键所在  
  8.     void Show();               //显示内容  
  9. };  
  10. ResumeA::ResumeA(const char *str)   
  11. {  
  12.     if(str == NULL) {  
  13.         name = new char[1];   
  14.         name[0] = '\0';   
  15.     }  
  16.     else {  
  17.         name = new char[strlen(str)+1];  
  18.         strcpy(name, str);  
  19.     }  
  20. }  
  21. ResumeA::~ResumeA() { delete [] name;}  
  22. ResumeA::ResumeA(const ResumeA &r) {  
  23.     name = new char[strlen(r.name)+1];  
  24.     strcpy(name, r.name);  
  25. }  
  26. ResumeA* ResumeA::Clone() {  
  27.     return new ResumeA(*this);  
  28. }  
  29. void ResumeA::Show() {  
  30.     cout<<"ResumeA name : "<<name<<endl;   
  31. }  

          这里只给出了ResumeA的实现,ResumeB的实现类似。使用的方式如下:

[cpp] view plaincopyprint?
  1. int main()  
  2. {  
  3.     Resume *r1 = new ResumeA("A");  
  4.     Resume *r2 = new ResumeB("B");  
  5.     Resume *r3 = r1->Clone();  
  6.     Resume *r4 = r2->Clone();  
  7.     r1->Show(); r2->Show();  
  8.     //删除r1,r2  
  9.     delete r1; delete r2;     
  10.     r1 = r2 = NULL;  
  11.     //深拷贝所以对r3,r4无影响  
  12.     r3->Show(); r4->Show();  
  13.     delete r3; delete r4;  
  14.     r3 = r4 = NULL;  
  15. }  

       最近有个招聘会,可以带上简历去应聘了。但是,其中有一家公司不接受简历,而是给应聘者发了一张简历表,上面有基本信息、教育背景、工作经历等栏,让应聘者按照要求填写完整。每个人拿到这份表格后,就开始填写。如果用程序实现这个过程,该如何做呢?一种方案就是用模板方法模式:定义一个操作中的算法的骨架,而将一些步骤延迟到子类中。模板方法使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。我们的例子中,操作就是填写简历这一过程,我们可以在父类中定义操作的算法骨架,而具体的实现由子类完成。下面给出它的UML图。

       其中FillResume() 定义了操作的骨架,依次调用子类实现的函数。相当于每个人填写简历的实际过程。接着给出相应的C++代码。

[cpp] view plaincopyprint?
  1. //简历  
  2. class Resume  
  3. {  
  4. protected//保护成员  
  5.     virtual void SetPersonalInfo() {}  
  6.     virtual void SetEducation() {}  
  7.     virtual void SetWorkExp() {}  
  8. public:  
  9.     void FillResume()   
  10.     {  
  11.         SetPersonalInfo();  
  12.         SetEducation();  
  13.         SetWorkExp();  
  14.     }  
  15. };  
  16. class ResumeA: public Resume  
  17. {  
  18. protected:  
  19.     void SetPersonalInfo() { cout<<"A's PersonalInfo"<<endl; }  
  20.     void SetEducation() { cout<<"A's Education"<<endl; }  
  21.     void SetWorkExp() { cout<<"A's Work Experience"<<endl; }  
  22. };  
  23. class ResumeB: public Resume  
  24. {  
  25. protected:  
  26.     void SetPersonalInfo() { cout<<"B's PersonalInfo"<<endl; }  
  27.     void SetEducation() { cout<<"B's Education"<<endl; }  
  28.     void SetWorkExp() { cout<<"B's Work Experience"<<endl; }  
  29. };  

        使用方式如下:

[cpp] view plaincopyprint?
  1. int main()  
  2. {  
  3.     Resume *r1;  
  4.     r1 = new ResumeA();  
  5.     r1->FillResume();  
  6.     delete r1;  
  7.     r1 = new ResumeB();  
  8.     r1->FillResume();  
  9.     delete r1;  
  10.     r1 = NULL;  
  11.     return 0;  
  12. }  
            本人享有博客文章的版权,转载请标明出处 http://blog.csdn.net/wuzhekai1985

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/436060.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【转】医疗业务学习笔记--DICOM协议的基础内容!!!!!!!!!!

转自&#xff1a;医疗业务学习笔记--DICOM协议的基础内容 - 知乎 本文首发于“雨夜随笔”公众号&#xff0c;欢迎关注。 DICOM协议是医疗领域对如何处理、存储、打印和传输医疗图片的一系列标准。DICOM是 Digital Imaging and Communications in Medicine 的缩写&#xff0c;…

linux去掉u盘写保护,最全面win10系统下u盘写保护怎么去掉

U盘写保护就是只能读取U盘中的内容&#xff0c;但是却不能修改或者将其它文件保存在U盘&#xff0c;有时候U盘写保护妨碍我们使用&#xff0c;有些朋友想要将其接除&#xff0c;对此&#xff0c;我给大家整理了win10移除写保护的方法&#xff0c;希望能帮助到你U盘是通过USB接口…

PHPBB安装

安装phpbb&#xff1a; 1、先下载phpbb安装包&#xff0c;根据自己需要下载中文包或英文包&#xff1b; 2、上传到phpmysql空间里&#xff0c;解压缩&#xff1b; 3、建立数据库&#xff1b; 4、在地址栏里输入自己的域名http://example.com/ 5、根据提示安装&#xff0c;其中会…

设计模式C++实现(5)——桥接模式

软件领域中的设计模式为开发人员提供了一种使用专家设计经验的有效途径。设计模式中运用了面向对象编程语言的重要特性&#xff1a;封装、继承、多态&#xff0c;真正领悟设计模式的精髓是可能一个漫长的过程&#xff0c;需要大量实践经验的积累。最近看设计模式的书&#xff0…

【转】CT基本概念(必须掌握)!!!!!!!!!!!!!!

转自&#xff1a;http://www.bmecn.com/wenku/knowledge/988.html 1.像素&#xff08;Pixel&#xff09;和体素&#xff08;Voxel&#xff09; 像素&#xff08;Pixel&#xff09;是构成图像的基本单位&#xff0c;即图像可被分解成的最小的独立信息单元。因为图像是二维的&a…

linux下sublime安装目录在那,linux下sublime text 3安装到配置

1. Sublime Text 3的下载安装到官方网站上http://www.sublimetext.com/3下载64位(系统位64位)的.deb安装包(http://c758482.r82.cf2.rackcdn.com/sublime-text_build-3059_amd64.deb)&#xff0c;下载后双击安装即可。安装好之后&#xff0c;通过命令subl即可打开程序&#xff…

推荐笔记本用户使用的硬盘。。。2.5”战胜台式机硬盘 日立7K320-250GB

2.5”战胜台式机硬盘 日立7K320-250GB 相关评测文章参考&#xff1a;http://www.beareyes.com.cn/2/lib/200808/07/20080807034_8.htm 转载于:https://www.cnblogs.com/bingdongli/archive/2008/10/05/1304169.html

设计模式C++实现(6)——适配器模式

软件领域中的设计模式为开发人员提供了一种使用专家设计经验的有效途径。设计模式中运用了面向对象编程语言的重要特性&#xff1a;封装、继承、多态&#xff0c;真正领悟设计模式的精髓是可能一个漫长的过程&#xff0c;需要大量实践经验的积累。最近看设计模式的书&#xff0…

【转】dcmtk程序包综述(1)!!!!!!

转自&#xff1a;https://blog.csdn.net/shenziheng1/article/details/70053152 1.前言 本文对dcmtk程序包做了简单介绍&#xff0c;包括主要接口类的简单说明&#xff0c;可用的工具以及一些例子。下一步工作准备详细分析每个程序包中的接口类功能&#xff0c;并结合源码和d…

edusoho linux 500错误,EduSoho网校系统如何处理500 Internal Server Error? - EduSoho官网

500 代表着服务器处理异常&#xff0c;因此需要找出服务报的异常。如何找出异常&#xff1f;根据框架提供的机制&#xff0c;只需要在web/app.php中将开发模式打开&#xff0c;就可以看到具体异常。$kernel new AppKernel(prod, false);改成$kernel new AppKernel(prod, true…

SQL大全

--语 句              功 能 --数据操作 SELECT   --从数据库表中检索数据行和列 INSERT   --向数据库表添加新数据行 DELETE   --从数据库表中删除数据行 UPDATE   --更新数据库表中的数据 --数据定义 CREATE TABLE  --创建一个数据库表 …

设计模式C++实现(7)——装饰模式

装饰模式&#xff1a;动态地给一个对象添加一些额外的职责。就增加功能来说&#xff0c;装饰模式相比生成子类更为灵活。有时我们希望给某个对象而不是整个类添加一些功能。比如有一个手机&#xff0c;允许你为手机添加特性&#xff0c;比如增加挂件、屏幕贴膜等。一种灵活的设…

【转】dcmtk程序包综述(2)!!!!!

转自&#xff1a;https://shenchunxu.blog.csdn.net/article/details/70054161 有删改 1.dcmnet程序包 dcmnet是一个网络库及可用工具。 该模块包含了实现DICOM网络通信的所有函数集&#xff0c;即&#xff1a;DICOM上层有限状态机(DICOM Upper Layer Finite State Machine)&…

较为周全的Asp.net提交验证方案 (下)

接上篇。 下面要对这个生成的“提交验证”类进行功能扩展&#xff0c;通过.Net的“部分类”或“扩展方法”技术都可以轻松实现&#xff0c;这里采用的是“部分类”技术&#xff1a; 引用生成的ADO.NET Entity Framework数据模型的命名空间&#xff0c;且声明为部分类。 书写静态…

linux 14.04安装方法,Ubuntu 14.04 安装配置GNOME经典界面

Ubuntu 14.04上基本完美支持GNOME经典界面&#xff0c;安装配置步骤如下&#xff1a;1. 安装gnome-session-flashbacksudo apt-get install gnome-session-flashback这个包安装后&#xff0c;注销后&#xff0c;在登录界面就能选择GNOME Flashback (Compiz)这个桌面环境了。2. …

设计模式C++实现 —— 策略模式

策略模式是指定义一系列的算法&#xff0c;把它们一个个封装起来&#xff0c;并且使它们可相互替换。本模式使得算法可独立于使用它的客户而变化。也就是说这些算法所完成的功能一样&#xff0c;对外的接口一样&#xff0c;只是各自实现上存在差异。用策略模式来封装算法&#…

【转】DIB位图(Bitmap)的读取和保存

转自&#xff1a;https://www.cnblogs.com/wangguchangqing/p/5417444.html 设备无关位图&#xff08;Device Independent Bitmap&#xff09;是可以保存在磁盘的位图文件&#xff0c;可以从磁盘读取到内存或者从内存保存到磁盘上。它的文件结构是标准化的&#xff0c;可以在W…

16进制字符串转化为10进制数

同学在MSN CDC电话面试&#xff08;可惜我在被面试的时候全然没有这么具体的问题了&#xff1a;&#xff09;&#xff09;中的一个题目&#xff1a;将16进制的字符串转化为10进制数字&#xff0c;例如“1A”&#xff0c;则对应26。题目很简单&#xff0c;实现起来也容易&#x…

arch linux 入门,arch linux 从来就不是给新手入门用的

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼在学生的时候&#xff0c;常会有些科目议题难&#xff0c;大部分的人死命地猛读&#xff0c;却也考得低分&#xff1b;也是会有够聪明又考的高分的人&#xff0c;轻描淡写地说&#xff1a;没时间读&#xff0c;随便看一下&#xff…

【转】DCMTK各模块说明!!!!!!!

转自&#xff1a;https://blog.csdn.net/Kelvin_Yan/article/details/50765693 有删改 原文来自wiki DCMTK&#xff1a;http://support.dcmtk.org/redmine/projects/dcmtk/wiki/modules 各模块说明 These are the modules of the public DCMTK toolkit (version 3.6.0): 关…