Chinaunix首页 | 论坛 | 博客
  • 博客访问: 32256
  • 博文数量: 11
  • 博客积分: 256
  • 博客等级: 二等列兵
  • 技术积分: 110
  • 用 户 组: 普通用户
  • 注册时间: 2010-07-15 17:02
文章存档

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原则

缺点:

继承的方式,使处理方法不能动态变化

产生太多子类,且代码重复,例如,DealFishBlock1DealFishBlock2

 

Template method Stategy的区别:

结构上:策略是组合而模板方法是继承

模板可变的是部分处理方法,而策略是整个处理方法可变

模板处理方法的变化是静态的,而策略处理方法可以运行时改变

阅读(1622) | 评论(0) | 转发(0) |
0

上一篇:表驱动法

下一篇:strategy

给主人留下些什么吧!~~