1.说明
请参阅第一章。
2.模板方法模式说明
模板方法模式:定义了一个操作算法的骨架,而将这些算法的实现延迟到子类,使得可以不改变一个算法的结构,而可以重定义某些特定的实现步骤。
继承的意义:在多个子类的重复都应该提炼到父类中去。
模板方法使用范围:当要完成某一细节层次一致的一个过程或一系列步骤时,但其个别步骤在更详细的层次上有不同的实现时,我们通常采用模板方法来处理。
优点:模板方法通常是把不变的行为迁移到超类,去除子类中重复的代码。
当不变的行为和可变的行为在子类中混合在一起时,不变的行为就会重复出现,通过模板方法可以把这些行为迁移到单一的地方,实现复用。
通俗:子类完成具体的实现,父类对这些实现调用顺序进行封装,接口提供等,client端不需要知道调用顺序不同,接口实现差异。
3.UML
4.代码
代码背景:统计xiao和zp起床过程所花的时间, 流程是一样的,但是每个人的花的值是不一样的。起床的流程都是一样的,里面的值是不一样的
//模板抽象的基类
#ifndef __COMMANDALIYLIFE_H
#define __COMMANDALIYLIFE_H
#include <iostream>
class CCommanDaliyLife
{
public:
int New_Day()
{
return HaveBreakFast() + GetUp() + BrushTeeth();
}
virtual int HaveBreakFast() = 0;
virtual int GetUp() = 0;
virtual int BrushTeeth() = 0;
};
#endif
//子类zp的实现
#ifndef __ZPDALIY_H
#define __ZPDALIY_H
#include "CommanDaliyLife.h"
class CZpDaliy:public CCommanDaliyLife
{
public:
int HaveBreakFast()
{
return 5;
}
int GetUp()
{
return 10;
}
int BrushTeeth()
{
return 3;
}
};
#endif
//xiao的实现
#ifndef __XIAODALIY_H
#define __XIAODALIY_H
#include "CommanDaliyLife.h"
class CXiaoDaliy:public CCommanDaliyLife
{
public:
int HaveBreakFast()
{
return 10;
}
int GetUp()
{
return 15;
}
int BrushTeeth()
{
return 3;
}
};
#endif
//client的实现
#include <iostream>
#include "CommanDaliyLife.h"
#include "XiaoDaliy.h"
#include "ZpDaliy.h"
int main(void)
{
CZpDaliy* zp = new CZpDaliy();
std::cout<<"zp cost time:"<<zp->New_Day()<<std::endl;
CXiaoDaliy* xiao = new CXiaoDaliy();
std::cout<<"xiao const time:"<<xiao->New_Day()<<std::endl;
return 0;
}