模版模式

王朝学院·作者佚名  2016-08-27  
宽屏版  字体: 小 | 中 | 大 | 超大  

模版模式又叫模板方法模式,在一个方法中定义一个算法的骨架,而将一些步骤延迟到子类中。模板方法使得子类可以在不改变算法结构的情冴下,重新定义算法中的某些步骤。

我们使用冲泡咖啡和冲泡茶的例子

加工流程:

咖啡冲泡法:1.把水煮沸、2.用沸水冲泡咖啡、3.把咖啡倒进杯子、4.加糖和牛奶

茶冲泡法: 1.把水煮沸、2.用沸水冲泡茶叶、3.把 茶 倒进杯子、4.加蜂蜜

一、创建一个创模板(抽象)类

packagecom.kaishengit.beverage;publicabstractclassBeverage {/*** 冲泡咖啡或茶...流程*/publicfinalvoidcreate(){

boilWater();//把水煮沸

brew();//用沸水冲泡...pourInCup();//把...倒进杯子addCoundiments();//加...}publicabstractvoidaddCoundiments();publicabstractvoid

brew();publicvoidboilWater() {

System.out.PRintln("煮开水");

}publicvoidpourInCup() {

System.out.println("倒进杯子");

}

}

2>创建一个咖啡类(Coffee)和茶(Tea)类,都继承Beverage抽象类

1.咖啡(Coffee)

packagecom.kaishengit.beverage;publicclassCoffeeextendsBeverage{

@OverridepublicvoidaddCoundiments() {

System.out.println("添加糖和牛奶"); }

@Overridepublicvoid

brew() {

System.out.println("用水冲咖啡");

}

}

2.茶(Tea)

packagecom.kaishengit.beverage;publicclassTeaextendsBeverage{

@OverridepublicvoidaddCoundiments() {

System.out.println("添加蜂蜜");

}

@Overridepublicvoid

brew() {

System.out.println("用水冲茶");

}

}

3.我们测试一下:

packagecom.kaishengit.beverage;publicclassTest {publicstaticvoidmain(String[] args) {

Coffee coffee=newCoffee();

coffee.create();//冲泡咖啡//Tea tea = new Tea();//冲泡茶//tea.create();}

}

运行结果:

-----------------------------------

煮开水

用水冲咖啡

倒进杯子

添加糖和牛奶

-----------------------------------

在模版模式中使用挂钩(hook)

存在一个空实现的方法,我们称这种方法为”hook”。子类可以视情况来决定是否要覆盖它。

1>我们对模板类(Beverage)进行修改

packagecom.kaishengit.beverage;publicabstractclassBeverage {/*** 冲泡咖啡或茶...流程*/publicfinalvoidcreate(){

boilWater();//把水煮沸

brew();//用沸水冲泡...pourInCup();//把...倒进杯子addCoundiments();//加...hook();//挂钩}//空实现方法publicvoidhook(){}publicabstractvoidaddCoundiments();publicabstractvoid

brew();publicvoidboilWater() {

System.out.println("煮开水");

}publicvoidpourInCup() {

System.out.println("倒进杯子");

}

}

2>假如我们搞活动,喝一杯咖啡送一杯,修改咖啡(Coffee)类

packagecom.kaishengit.beverage;publicclassCoffeeextendsBeverage{

@OverridepublicvoidaddCoundiments() {

System.out.println("添加糖和牛奶"); }

@Overridepublicvoid

brew() {

System.out.println("用水冲咖啡");

}/*** 挂钩*/@Overridepublicvoidhook() {

System.out.println("再来一杯");

}

}

3>使用上面的测试类

运行结果:

--------------------------------

煮开水

用水冲咖啡

倒进杯子

添加糖和牛奶

再来一杯

--------------------------------

结果中有“再来一杯”...

我们也可以这样使用挂钩,让其决定里面的代码是否执行

1>我们对模板类(Beverage)进行修改

packagecom.kaishengit.beverage;publicabstractclassBeverage {/*** 冲泡咖啡或茶...流程*/publicfinalvoidcreate(){

boilWater();//把水煮沸

brew();//用沸水冲泡...pourInCup();//把...倒进杯子//挂钩决定是否添加配料if(hook()){

addCoundiments();//加...}//hook();}/*** 默认添加配料

*@return*/publicbooleanhook() {returntrue;

}//public void hook(){}publicabstractvoidaddCoundiments();publicabstractvoid

brew();publicvoidboilWater() {

System.out.println("煮开水");

}publicvoidpourInCup() {

System.out.println("倒进杯子");

}

}

2>我们对Coffee类进行修改,让其不添加配料

packagecom.kaishengit.beverage;publicclassCoffeeextendsBeverage{

@OverridepublicvoidaddCoundiments() {

System.out.println("添加糖和牛奶"); }

@Overridepublicvoid

brew() {

System.out.println("用水冲咖啡");

}/*** 有的客人不喜欢加配料*/@Overridepublicbooleanhook() {returnfalse;

}/*@Override

public void hook() {

System.out.println("再来一杯");

}*/}

3>还是使用上面的测试类

运行结果:

------------------------------------------------------

煮开水

用水冲咖啡

倒进杯子

------------------------------------------------------

运行结果中没有添加配料

关于模板模式

1>模板模式定义了算法的步骤,把这些步骤的实现延迟到子类

2>模板模式为我们提供了一个代码复用的技巧

3>模板抽象类中可以定义具体方法、抽象方法和钩子方法

4>为了防止子类改变模板中的算法,可以将模板方法声明为final

5>钩子是一种方法,它在抽象类中不做事,或只做默认的事,子类可以选择要不要实现它

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
© 2005- 王朝网络 版权所有