`

模版设计模式

 
阅读更多
定义:在一个方法中定义一个算法骨架,而将一些步骤延伸到子类中。(其本质:把可变和不可变进行分类。可变部分延伸到子类来完成,不变部分交给父类定义成骨架)

优点
      1)可以使的子类可以在不改变算法骨架的情况下,重新定义算法中的某些步骤。
      2)模版方法通过把不变的部分搬移到超类,去除了子类中的重复代码。
      3)子类实现算法的特定步骤,有利于算法的扩展。
      4) 通过一个父类调用子类实现的操作,通过子类扩展新的行为,符合“开放-封闭原则”。
缺点:每一个不同的实现都需要一个子类来完成,这个会导致子类个数的增加,设计更抽象。
 

使用场景
      1)在某些算法中,有了相同的方法,造成的代码重复。
      2)控制子类扩展,子类必须遵守算法规则。


场景:
   
          冲茶水:                           冲咖啡:
              1) 洗杯子              1)洗杯子
              2) 烧开水              2)烧开水
              3) 加料(加茶叶)      3)加料(加咖啡)
              4) 烫材料(沸水烫茶叶)4)烫材料(温水冲咖啡)

分析:
不变部分:冲咖啡和冲茶水的步骤是一样的,抽象部分(不变部分:1洗杯子、2烧开水、3加料、4烫材料)
可变部分:加料和烫料是可变部分。因此此部分需要交给子类扩展延伸,保证了代码在骨架上的重用。

1、定义模版(冲水模版)
public abstract class  FlushWaterTemple{
  //定义算法骨架
  public void flushWater(){
      wash();
      boilWater();
      addMaterial();
      finshedWater();
  }
  public void wash(){
      System.out.println("洗杯子");
  }
  public void boilWater(){
      System.out.println("烧水");
  }

  //加料
  public  abstract void  addMaterial();
   //烫材料
  public  abstract void  finshedWater();

}

}

2、冲茶叶
public class FlushTea extends FlushWaterTemple{
  //加料
  public void  addMaterial(){
      System.out.println("加点茶叶");
  }
  //烫材料
  public void  finshedWater(){
      System.out.println("用沸水烫茶叶");
  }

}
   

2、冲咖啡
public class FlushCoffee extends FlushWaterTemple{
  //加料
  public void  addMaterial(){
      System.out.println("加点咖啡");
  }
  //烫材料
  public void  finshedWater(){
      System.out.println("用温水烫咖啡");
  }

} 


测试
public class Test{

       public static void main(){
           FlushWaterTemple  tmp =  new FlushCoffee();
           tmp.flushWater();
       }
}
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics