【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
原创粉丝点击