[设计模式]行为模式-模板方法(C++描述)
second60 20180504
1. 什么是模板方法
定义一个操作中算法的骨架,而将一些步骤延迟到子类中实现,模板方法使得子类可以不改变算法的结构即可重定义该算法的某些特定步骤。
简单地说:完成一件事情,有些步骤相同,有些步骤不相同,在父类中定义模板方法,写好具体流程,但具体的实现是在子类中。
2. 模板方法结构图
分析:
模板方法类:实现了模板方法,定义了算法的骨架。
具体实现类:定现抽象类中的抽象方法,即算法骨架中的步骤。
代码:
// 模板方法类
class Template
{
public:
virtual ~Template(){}
void templateMethon()
{// 算法骨架
this->do1();
this->do2();
this->do3();
}
// 算法步骤
virtual void do1() = 0;
virtual void do2() = 0;
virtual void do3() = 0;
};
// 算法实现类
class ConcreteClass: public Template
{
public:
void do1(){}
void do2(){}
void do3(){}
};
class ConcreteClass1: public Template
{
public:
void do1(){}
void do2(){}
void do3(){}
};
// 使用算法1
Template* tem1 = new ConcreteClass;
tem1->templateMethon();
// 使用算法2
Template* tem2 = new ConcreteClass;
tem2->templateMethon();
2.1 优点
1. 定义了算法的骨架,实现延迟到子类中
2. 模板方法是一种代码复用的技术,提取了公共的行为
3. 是一种反向控制的结构,通过父类调用子类的具体实现。
4. 通过子类对父类,扩展新的行业,符合开闭原则。
2.2 缺点
1. 每种实现都会有新的子类,类的个数增加,系统变得庞大
3 适用场景
1. 某业务或算法中有固定的步骤,且步骤中具有可变的逻辑来实现不同的算法。
2. 适用于某抽象类中,子类公共的逻辑,即把子类公共逻辑提取到父类中。
3. 适用于反转控制逻辑,即父类调用子类的方法。
4 例子
举个棋牌类的例子:如棋牌中有很多麻将,麻将的结算有一个固定的流程:基本番结算,别加番结算,其他结算,总结算。那么可以写成模版方法。
分析:
1. 定义一个麻将结算模版抽象类 MahjongFan
2. 不同地方麻将总体流程是一致的,但结算方法是不一致的。
//抽象类
class MahjongFan
{
public:
virtual ~MahjongFan();
int compute()
{
this->basicFan();
this->specialFan();
this->otherFan();
return countAll();
}
virtual int basicFan() = 0;
virtual int specialFan() = 0;
virtual int otherFan() = 0;
virtual int countAll() = 0;
private:
int FanNum; //番数
int FanMultiple: //番倍数
};
//济南麻将算番
class JiNanMahjongFan:public MahjongFan
{
public:
int basicFan()
{
FanNum = 1;//算出基本番
}
int specialFan()
{
FanNum += 2;//算出基本番
}
int otherFan()
{
FanNum += 1;//其他加番
}
int countAll()
{
//麻将的结算公式,不同麻将不同
int count = baseship * FanNum * 明楼倍数*飘倍数;
return count;
}
};
上面对于济南麻将是一种结算,对于一百种麻将,可能会有一百种不同结算,而且每个地方都有自已的特殊的算法。通过模版方法,每个地方,只需增加一个类并实现即可。使算法类做单一职责,同时各个地方算法互不影响,使用时,只需使用具体地方的算番类即可
MahjongFan* jinanFan = new JiNanMahjongFan();
jinanFan->compute();
4 总结
模板方法类,符合单一职责和开放关闭原则,是一种比较好的行为实现方法。把父类的调用实现延迟到子类中实现,从而使父类具有统一的接口,但却有不同的实现。有良好的扩展性,但通常适用于固定步骤,且步骤可变的算法或业务中。
5 后语
今天终于讲到设计模式中的行为模式,相对于创建和结构模式,行为模式用途更多,品种也更多。每种设计模式都是为了解决某些问题而产生的。同时一个问题,也可能由多种模式都可解决。具体使用哪种,看实现需求而定。学以致用,我也会把用过的或可以用到某项目的分享出来。分享也是一种乐趣。