介绍
简单,就是多态非常简单的运用!
模板方法
百度解释:
定义一个操作中的算法的骨架,而将一些步骤延迟到子类中。模板方法使得子类可以不改变一个算法的结构即可重新定义该算法的某些特定步骤
在做程序的过程中,会用到继承,就要继承做的更有价值,成为子类的模板,所有重复的代码都应该上升到父类中,而不是让每个子类都去重复。当我们要完成某一个细节层次一致的一个过程或一系列步骤,但其个别步骤在更详细的层次上的实现可能不同时,用到模板方法模式,将不同的地方转移到子类中,在需要的时候进行重新定义。
举例
大部分人不可能一生就一个固定的工作,所以在写简历的过程注定有一栏是工作经历。可是每一次工作经历大概相同,无非就是入职年份,任期工作内容,离职时间。但是具体的内容又不一样,随着不断的求职,这个随之改变,不能每一次求职都重写一份原型吧。这个时候可以用到模板方法模式。把工作经历中大概流程放到抽象类中,把具体的内容填写到子类中。这样在抽象类中定义一个操作算法的骨架,将具体的步骤延迟到子类中。
代码:
class NameDb
{
protected:
virtual void initialize() {}
virtual void setinitia() {}
virtual void getinitia() {}
public:
void FillNameDb() {
initialize();
setinitia();
getinitia();
}
};
class NameDbA : public NameDb
{
void initialize() {cout << "initialize A \n";}
void setinitia() {cout << "setinitia A\n";}
void getinitia() {cout << "getinitia A\n";}
};
class NameDbB : public NameDb
{
void initialize() {cout << "initialize B\n";}
void setinitia() {cout << "setinitia B\n";}
void getinitia() {cout << "getinitia B\n";}
};
int main ()
{
NameDb *p1 = new NameDbA;
p1->FillNameDb();
delete p1;
p1 = new NameDbB();
p1->FillNameDb();
delete p1;
p1 = NULL;
return 0;
}
原型模型
百度解释:
所谓的原型模式:用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。
从一个对象再创建另外一个可定制的对象,而且不需要知道任何创建的细节。应该注意概念中的拷贝两个字,这是原型模式的精髓所在。原型模式实行的关键就是clone函数。
例子:
简历复制,之前没有复印机的时候,完全手写,需要写很多份重复的简历,如果简历有错,改起来也是相当费劲了。后来有了打印机,在出现简历错误,只需要改一份,之后再复印的内容就是正确的了。无论是手抄还是复印,在执行这些方法的时候肯定之前有一份原始的初稿,故这个可以理解为原型模式
修改刚刚的代码
//父类
class NameDb
{
public:
NameDb() {}
virtual ~NameDb() {}
virtual NameDb* Clone() { return NULL; }
virtual void ShowName() {}
protected:
char* m_Name;
};
//子类
class NameDbA : public NameDb
{
public:
NameDbA(const char *str);
NameDbA(const NameDbA &r);
~NameDbA();
NameDbA* Clone();
void ShowName();
};
NameDbA::NameDbA(const char *str)
{
if(str == NULL) {
m_Name = new char[1];
m_Name[0] = '\0';
}
else {
m_Name = new char[strlen(str)+1];
strcpy(m_Name, str);
}
}
NameDbA::~NameDbA() { delete [] m_Name;}
NameDbA::NameDbA(const NameDbA &r) {
m_Name = new char[strlen(r.m_Name)+1];
strcpy(m_Name, r.m_Name);
}
NameDbA* NameDbA::Clone() {
return new NameDbA(*this);
}
void NameDbA::ShowName() {
cout<<"NameDbA name : "<<m_Name<<endl;
}
int main ()
{
NameDb *p1 = new NameDbA("AAA");
p1->ShowName();
delete p1;
p1 = NULL;
return 0;
}