【C++】原型模式
来源:互联网 发布:mac炒股软件 知乎 编辑:程序博客网 时间:2024/06/05 18:37
本文与《【Java】原型模式》(点击打开链接)是姊妹篇,具体的相关概念在这里就不赘述了。
主要是想说明如何利用C++说明如何实现原型模式。
还是同样采用2013年上半年软件设计师的最后一题作为例子来说明这个问题。唯一的不同,是选用其C++来实现。
题目还是这样一字没变:
现要求实现一个能够自动生成求职简历的程序。简历的基本内容包括求职者的姓名、性别、年龄以及工作经历等。希望每份简历的工作经历有所不同,并尽量减少程序中重复的代码。
现采用原型(Prototype)模式来实现上述要求,得到如图6-1所示的类图:
只是用到C++来实现的话,将会面临如何定义接口与处理指针问题,C++可没有Java自带Cloneable接口给你对接。必须自己定义虚函数来实现,同时,也要自己处理好指针的问题,不如程序编译通过,但就是不停的异常抛出。同时C++里面的实现虚函数从implements变成了冒号,C++声明完一个类后面要补一个分号,这些基本的语法问题就不多说了。
我们的任务还是在主函数搞两份简历A与B,但是B无须初始化,直接抄A的内容,然后就是改变其中的工作经历。
具体代码如下:
#include<iostream>#include<string>using namespace std;class Cloneable{public:virtual Cloneable* Clone()=0;//定义Clone接口,根据不同的派生类来实例化对象(实现这个接口、虚函数),也就是在这个虚函数中写语言实现它!};//这个分号一定要注意,这里不是Javaclass WorkExperience:public Cloneable{private:string workDate;string company;public:Cloneable* Clone(){WorkExperience *obj = new WorkExperience();obj->workDate=this->workDate;obj->company=this->company;return obj;}//getter setter方法,原题目没有,被省略了。void setWorkDate(string workDate){this->workDate = workDate;}void setCompany(string company){this->company=company;}string getWorkDate(){return workDate;}string getCompany(){return company;}};class Resume:public Cloneable{private:string name;string age;string sex;WorkExperience* work;Resume(WorkExperience* work){this->work=work;}public:Resume(string name){this->name=name;work = new WorkExperience();//在Resume中private声明中,新建的workexperience * work需要初始化。否则会出现指针异常,原题目被省略了。}void setPersonalInfo(string sex,string age){this->sex=sex;this->age=age;}void setWorkExperience(string workDate,string company){work->setWorkDate(workDate);work->setCompany(company);}void getAll(){//用来输出数据的代码,原题目没有,被省略了。cout<<work->getWorkDate()<<","<<work->getCompany()<<","<<age<<","<<sex<<endl;}Cloneable* Clone(){Resume *obj = new Resume(work);obj->name=this->name;obj->age=this->age;obj->sex=this->sex;return obj;}};int main(){Resume *a=new Resume("张三");a->setPersonalInfo("男","29");a->setWorkExperience("1998-2000","XXX公司");a->getAll();Resume *b=(Resume *)a->Clone();//这里必须通过强制类型转换才能匹配类型,部分参考答案没有强制类型转化是错误的,根本就无法通过编译。b->setWorkExperience("2001-2006", "YYY公司");b->getAll();return 0;}
运行的结果如下:
可以看到,简历B根本没有初始化,只是完全复制A的东西,同时只是改变了工作简历。证明程序正确。
利用原型模式,减少了B在初始化的时候,又要重新输入姓名、年龄等信息的繁琐步骤。
对比于Java的实现,C++的实现比较难。利用自身的虚函数代替Java的接口,比较难以记忆,但是习惯就好。
0 0
- 【C++】Chapter6:原型模式
- Objective C--原型模式
- Objective C 原型模式
- Objective C--原型模式
- 【C++】原型模式
- 原型模式(C++)
- C语言设计模式:原型模式
- 设计模式之原型模式(C++)
- C#--设计模式之原型模式
- 乐在其中设计模式(C#) - 原型模式(Prototype Pattern)
- C语言和设计模式(之原型模式)
- C语言和设计模式(之原型模式)
- C语言和设计模式(之原型模式)
- C语言和设计模式(之原型模式)
- 原型模式 c++(对象创建型模式)
- 23. C语言和设计模式(之原型模式)
- C语言和设计模式(之原型模式)
- 4、C语言和设计模式(之原型模式)
- excel中如何筛选重复数据
- 正则后台验证、抓包
- Android计算器
- iOS9适配必看指南
- iOS-Git使用详解
- 【C++】原型模式
- iOS 处理服务器返回的浮点数数据
- 完整精确导入Kernel与Uboot参与编译了的代码到Source Insight,Understand, SlickEdit
- 指针的指针
- 安卓JNI使用C++类
- 数据库基础
- 导出excel 利用xml文件
- Linux 系统挂载数据盘
- PHPCMS V9自定义分页函数