软件领域中的设计模式为开发人员提供了一种使用专家设计经验的有效途径。设计模式中运用了面向对象编程语言的重要特性:封装、继承、多态,真正领悟设计模式的精髓是可能一个漫长的过程,需要大量实践经验的积累。最近看设计模式的书,对于每个模式,用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

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

  1. 【设计模式】第十三章:模板方法模式详解及应用案例

    系列文章 [设计模式]七大设计原则 [设计模式]第一章:单例模式 [设计模式]第二章:工厂模式 [设计模式]第三章:建造者模式 [设计模式]第四章:原型模式 [设计模式]第五章:适配器模式 [设计模式 ...

  2. 设计模式 — 行为型模式 — 模板方法模式

    目录 文章目录 目录 模板方法模式 应用场景 代码示例 模板方法模式 模板方法模式,定义一个算法或者流程,部分环节设计为外部可变,用类似于模板的思想来实例化一个实体,可以往模板中填充不同的内容: 在模 ...

  3. Java设计模式(代理模式-模板方法模式-命令模式)

    Java设计模式Ⅴ 1.代理模式 1.1 代理模式概述 1.2 静态代理 1.2.1 静态代理概述 1.2.2 代码理解 1.3 动态代理之JDK代理 1.3.1 动态代理之JDK代理概述 1.3.2 ...

  4. Head First设计模式读书笔记七 第八章 模板方法模式

    本文示例代码材料源自Head First设计模式 以前整理自己整理的链接: https://blog.csdn.net/u011109881/article/details/60594985 简介 模 ...

  5. 《设计模式详解》行为型模式 - 模板方法模式

    模板方法模式 6.1 模板方法模式 6.1.1 概述 6.1.2 结构 6.1.3 案例实现 6.1.3 优缺点 6.1.4 适用场景 6.1.5 JDK源码 - InputStream 完整的笔记目 ...

  6. 李建忠设计模式-组件协作模式-模板方法模式

    目录 1.前言 2.模板方法模式(Template Method) 1.动机 2.例子 3.定义 1.结构图 2.模板方法模式适用情形 3.模式特点 参考 1.前言 现代软件专业分工后的第一个结果是& ...

  7. 设计模式学习(十六) 模板方法模式

    场景: -- 客户到银行办理业务 1:取号排队 2:办理具体现金/转账/企业/个人/理财业务 3: 给银行工作人员评分 模板方法介绍; -- 模板方法模式是编程中经常用到的模式,它定义了一个操作中的算 ...

  8. java设计模式-- 观察者模式 , 外观模式, 模板方法模式

    观察者模式: 观察者模式比较容易理解: 比如天龙八部里面的王语嫣,每次慕容复打架的时候,每当别人将要使出什么绝招时,会提醒慕容复注意提防. 项目中用到的地方就是注册中中心,zookeeper,当Pro ...

  9. 聊聊那些专为算法设计的模式——模板方法模式

    AI越来越火热,人工智能已然成风!而人工智能最重要是各种算法,因此机器学习越来越受到追捧,算法越来越被重视. 作为一个算法的研究者,写出一手高级算法当然是令人兴奋的一件事!但你是否有时会有这种感觉: ...

  10. 行为型模式-模板方法模式

    1.概述 在面向对象程序设计过程中,程序员常常会遇到这种情况:设计一个系统时知道了算法所需的关键步骤,而且确定了这些步骤的执行顺序,但某些步骤的具体实现还未知,或者说某些步骤的实现与具体的环境相关. ...

最新文章

  1. 图像去噪的深度学习最新综述论文,36页pdf,Deep Learning on Image Denoising
  2. Android json操作之取得一个对象
  3. 【错误记录】Groovy 报错 ( Execution failed for task ‘:compileGroovy‘. > org/apache/tools/ant/taskdefs/Java )
  4. JAVA数据结构与算法【简单介绍】
  5. 图数据集之cora数据集介绍 --- 适用于GCN任务
  6. java8 supplier 接口
  7. 前端学习(1272):路由的基本概念和说明
  8. 【学习笔记】《Go 指南》
  9. java编译_解析 Java 即时编译器原理。
  10. linux用户类型分类,信息安全技术题库:SELinux安全上下文主要包括用户、角色、类型、层次和分类字段。( )...
  11. ID3决策树预测的java实现
  12. 经典书单 —— 计算机图形学
  13. JAVAWEB 一一 Spirng(AOP面向切面)
  14. Microsoft word 表格居中对齐方法
  15. android 图片合成pdf文件,如何在Android上将多个图像合并到PDF文件中 | MOS86
  16. simulink模型动静态测试
  17. 微信小程序自定义弹窗2.0
  18. 专访郑博闻:13岁的iOS开发者和创业者
  19. PMP之项目质量管理
  20. MyBatis高效同步百万级数据

热门文章

  1. (一)卷积网络之基础要点
  2. 1049. 数列的片段和(20)
  3. python linux alias,linux命令:alias
  4. qchart 设置线颜色_实战PyQt5: 137-QChart图表之散点图
  5. 【C++深度剖析教程33】C++中的构造函数与析构函数是否可以为虚函数
  6. docker 配置文件:/etc/docker/daemon.json
  7. vue基础18(vue-cli脚手架项目中组件的使用)
  8. JVM第五部分 高效并发
  9. 《Java技术》第八次作业
  10. Python 爬虫抓取代理IP,并检测联通性