【C++】原型模式

本文与《【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的接口,比较难以记忆,但是习惯就好。

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值