您的位置:首页 > 编程语言 > C语言/C++

【C++】原型模式

2015-10-12 12:31 477 查看
本文与《【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接口,根据不同的派生类来实例化对象(实现这个接口、虚函数),也就是在这个虚函数中写语言实现它!
};//这个分号一定要注意,这里不是Java

class 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的接口,比较难以记忆,但是习惯就好。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: