设计模式C++实现(5)——原型模式、模板方法模式
更新时间:2023-05-13 23:07:01 阅读量: 实用文档 文档下载
- 设计模式c++实现推荐度:
- 相关推荐
设计模式C++实现
设计模式C++实现(5)——原型模式、模板方法模式
分类: 设计模式2011-08-07 16:37 2075人阅读 评论(1) 收藏 举报
软件领域中的设计模式为开发人员提供了一种使用专家设计经验的有效途径。设计模式中运用了面向对象编程语言的重要特性:封装、继承、多态,真正领悟设计模式的精髓是可能一个漫长的过程,需要大量实践经验的积累。最近看设计模式的书,对于每个模式,用C++写了个小例子,加深一下理解。主要参考《大话设计模式》和《设计模式:可复用面向对象软件的基础》(DP)两本书。本文介绍原型模式和模板方法模式的实现。首先介绍原型模式,然后引出模板方法模式。
DP书上的定义为:用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。其中有一个词很重要,那就是拷贝。可以说,拷贝是原型模式的精髓所在。举个现实中的例子来介绍原型模式。找工作的时候,我们需要准备简历。假设没有打印设备,因此需手写简历,这些简历的内容都是一样的。这样有个缺陷,如果要修改简历中的某项,那么所有已写好的简历都要修改,工作量很大。随着科技的进步,出现了打印设备。我们只需手写一份,然后利用打印设备复印多份即可。如果要修改简历中的某项,那么修改原始的版本就可以了,然后再复印。原始的那份手写稿相当于是一个原型,有了它,就可以通过复印(拷贝)创造出更多的新简历。这就是原型模式的基本思想。下面给出原型模式的UML图,以刚才那个例子为实例。
原型模式实现的关键就是实现Clone函数,对于C++来说,其实就是拷贝构造函数,需实现深拷贝,下面给出一种实现。
[cpp] view plaincopyprint?
1. //父类
2. class Resume
3. {
4. protected:
5. char *name;
6. public:
设计模式C++实现
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()+1];
24. strcpy(name, );
25. }
26. ResumeA* ResumeA::Clone() {
27. return new ResumeA(*this);
28. }
29. void ResumeA::Show() {
30. cout<<"ResumeA name : "<<name<<endl;
设计模式C++实现
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图。
设计模式C++实现
其中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
设计模式C++实现
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. }
正在阅读:
设计模式C++实现(5)——原型模式、模板方法模式05-13
2012~第一学期期末考试七年级英语试卷09-14
2015广西北海事业单位招聘:银海区海洋和水产畜牧兽医局招聘2人公告10-14
我要去探险作文300字06-25
新中大SE年结(2007)05-29
学校变美了作文600字07-16
2004-2010浙江公务员考试面试真题及答案解析05-29
描写蜗牛的作文800字06-29
旧鞋旅行记作文600字06-17
我眼中的母爱作文600字06-21
- 教学能力大赛决赛获奖-教学实施报告-(完整图文版)
- 互联网+数据中心行业分析报告
- 2017上海杨浦区高三一模数学试题及答案
- 招商部差旅接待管理制度(4-25)
- 学生游玩安全注意事项
- 学生信息管理系统(文档模板供参考)
- 叉车门架有限元分析及系统设计
- 2014帮助残疾人志愿者服务情况记录
- 叶绿体中色素的提取和分离实验
- 中国食物成分表2020年最新权威完整改进版
- 推动国土资源领域生态文明建设
- 给水管道冲洗和消毒记录
- 计算机软件专业自我评价
- 高中数学必修1-5知识点归纳
- 2018-2022年中国第五代移动通信技术(5G)产业深度分析及发展前景研究报告发展趋势(目录)
- 生产车间巡查制度
- 2018版中国光热发电行业深度研究报告目录
- (通用)2019年中考数学总复习 第一章 第四节 数的开方与二次根式课件
- 2017_2018学年高中语文第二单元第4课说数课件粤教版
- 上市新药Lumateperone(卢美哌隆)合成检索总结报告
- 模式
- C++
- 设计模式
- 原型
- 模板
- 实现
- 方法
- 武汉大学就业系统学生用户操作手册
- 2011年机械制造与自动化考试试卷
- 第八章 销售人员的业绩评估与控制
- 近年来关于_中国模式_研究综述
- 长安福特马自达&183;Mazda3
- 初中化学第三单元课题3元素
- 污水处理工艺节能降耗研究
- 2013年冬季汽车维修高级证实操题目及参考答案
- 用友供应链详细业务流程
- 中国海员之家网站航海英语系列 GMDSS 英语 第 1 页
- 西南科技大学2012模拟电子技术基础期末考试_试题
- 2014广西钦州市钦北区事业单位招聘报考条件
- 基层党组织“两学一做”问题以及整改措施清单
- 房屋结构安全鉴定标准
- PCR—SSP基因分型技术在ABO疑难血型定型中的应用
- 体育梦、中国梦与和谐世界
- 宝坻区农业实用技术丛书
- 2016-2022年中国专网通信产业现状分析及十三五投资策略研究报告
- 课题研究中期结题报告参评
- 2013年劳动模范评选标准