2011年(11)
分类: C/C++
2011-06-08 22:02:10
模板方法模式,适用于这种场合:做某件事情,需要几大步已经固定并且被知道,每个步骤的做法可以有很多种。
老婆今天突然想吃鱼,你该咋整呢?
第一步,获取一条鱼。直接从冰箱里拿、或者去市场买一条、或者去江里钓一条…
第二步,处理鱼。切块、或者切坨、或者切片…..
第三步,烹饪。红烧、或者做火锅、或者….
你的代码时这样的:
Calss CookFish
{
Public:
//获取鱼的做法
getFish()
{
If(条件一)
{
冰箱里取鱼
}
else if(条件二)
{
去市场买一条
}
else if(条件三)
{
去江里钓一条
}
else
{
默认处理方法
}
}
//处理鱼的做法
dealFish()
{
If(条件一)
{
切块
}
else if(条件二)
{
切陀
}
else if(条件三)
{
切片
}
else
{
默认处理方法
}
}
//烹饪鱼的做法
cookFish()
{
If(条件一)
{
红烧
}
else if(条件二)
{
火锅
}
else if(条件三)
{
酸菜鱼
}
else
{
默认处理方法
}
}
//步骤框架
Public Process()
{
getFish();
dealfish();
cookFish();
}
};
写完代码,你是不是又看到太多的if else,如果这三个步骤还要增加其他处理方法,是不是又要去修改原代码,继续if else。省省吧,看看前人总结的方法—Template method
其标准结构是:
其中AbstractClass是定义处理步骤和默认方法的,其中templateMethod定义了处理步骤框架(不能被覆盖),subMethod为处理步骤的默认实现,有几个步骤就应该有几个subMethod;而concreteClass是各变化步骤的具体实现之一。
以烧鱼为例,我们的类图应该是这样的:上图只是一部分,处理步骤的多样性,以及步骤之间的组合构成了多种继承和继承方式,如果有步骤的实现方法增加了,我们只需要在这里增加继承就行了,具体的代码,就不再赘述。
Template method方法有如下优缺点:
优点:
提高了代码的扩展性,易增加步骤的新的实现方法,也符合ocp原则
缺点:
继承的方式,使处理方法不能动态变化
产生太多子类,且代码重复,例如,DealFishBlock1和DealFishBlock2
Template method 和 Stategy的区别:
结构上:策略是组合而模板方法是继承
模板可变的是部分处理方法,而策略是整个处理方法可变
模板处理方法的变化是静态的,而策略处理方法可以运行时改变