标签:
1>模板模式定义了算法的步骤,把这些步骤的实现延续到子类
2>模板模式为我们提供了一个代码复用的技巧
3>模板抽象类中可以定义具体方法、抽象方法和钩子方法
4>为了防止子类改变模板中的算法,可以将模板方法声明为final
5>钩子是一种方法,它在抽象类中不做事,或只做默认的事,子类可以选择要不要实现它
模板方法模式,在一个方法中定义一个算法的骨架,而将一些步骤延迟到子类中。模板方法使得子类可以在不改变算法结构的情冴下,重新定义算法中的某些步骤。
我们使用冲泡咖啡和冲泡茶的例子
加工流程:
咖啡冲泡法:1.把水煮沸、2.用沸水冲泡咖啡、3.把咖啡倒进杯子、4.加糖和牛奶
茶冲泡法: 1.把水煮沸、2.用沸水冲泡茶叶、3.把 茶 倒进杯子、4.加蜂蜜
实践步骤:
1>创建一个模板(抽象)类:Beverage(饮料)
- package com.kaishengit.beverage;
-
- public abstract class Beverage {
-
- public final void create(){
- boilWater();
- brew();
- pourInCup();
- addCoundiments();
- }
-
-
- public abstract void addCoundiments();
-
- public abstract void brew();
-
- public void boilWater() {
- System.out.println("煮开水");
- }
-
- public void pourInCup() {
- System.out.println("倒进杯子");
- }
- }
2>创建一个咖啡类(Coffee)和茶(Tea)类,都继承Beverage抽象类
1.咖啡(Coffee)
- package com.kaishengit.beverage;
-
- public class Coffee extends Beverage{
-
- @Override
- public void addCoundiments() {
- System.out.println("添加糖和牛奶"); }
-
- @Override
- public void brew() {
- System.out.println("用水冲咖啡");
- }
- }
2.茶(Tea)
- package com.kaishengit.beverage;
-
- public class Tea extends Beverage{
-
- @Override
- public void addCoundiments() {
- System.out.println("添加蜂蜜");
- }
-
- @Override
- public void brew() {
- System.out.println("用水冲茶");
- }
-
- }
3.我们测试一下:
- package com.kaishengit.beverage;
-
- public class Test {
- public static void main(String[] args) {
- Coffee coffee = new Coffee();
- coffee.create();
-
-
-
- }
- }
运行结果:
-----------------------------------
煮开水
用水冲咖啡
倒进杯子
添加糖和牛奶
-----------------------------------
在模版模式中使用挂钩(hook)
存在一个空实现的方法,我们称这种方法为”hook”。子类可以视情况来决定是否要覆盖它。
1>我们对模板类(Beverage)进行修改
- package com.kaishengit.beverage;
-
- public abstract class Beverage {
-
- public final void create(){
- boilWater();
- brew();
- pourInCup();
- addCoundiments();
-
- hook();
- }
-
- public void hook(){}
-
- public abstract void addCoundiments();
-
- public abstract void brew();
-
- public void boilWater() {
- System.out.println("煮开水");
- }
-
- public void pourInCup() {
- System.out.println("倒进杯子");
- }
- }
2>假如我们搞活动,喝一杯咖啡送一杯,修改咖啡(Coffee)类
- package com.kaishengit.beverage;
-
- public class Coffee extends Beverage{
-
- @Override
- public void addCoundiments() {
- System.out.println("添加糖和牛奶"); }
-
- @Override
- public void brew() {
- System.out.println("用水冲咖啡");
- }
-
-
- @Override
- public void hook() {
- System.out.println("再来一杯");
- }
-
- }
3>使用上面的测试类
运行结果:
--------------------------------
煮开水
用水冲咖啡
倒进杯子
添加糖和牛奶
再来一杯
--------------------------------
结果中有“再来一杯”...
我们也可以这样使用挂钩,让其决定里面的代码是否执行
1>我们对模板类(Beverage)进行修改
- package com.kaishengit.beverage;
-
- public abstract class Beverage {
-
- public final void create(){
- boilWater();
- brew();
- pourInCup();
-
-
- if(hook()){
- addCoundiments();
- }
-
- }
-
-
- public boolean hook() {
- return true;
- }
-
-
-
- public abstract void addCoundiments();
-
- public abstract void brew();
-
- public void boilWater() {
- System.out.println("煮开水");
- }
-
- public void pourInCup() {
- System.out.println("倒进杯子");
- }
- }
2>我们对Coffee类进行修改,让其不添加配料
- package com.kaishengit.beverage;
-
- public class Coffee extends Beverage{
-
- @Override
- public void addCoundiments() {
- System.out.println("添加糖和牛奶"); }
-
- @Override
- public void brew() {
- System.out.println("用水冲咖啡");
- }
-
-
- @Override
- public boolean hook() {
- return false;
- }
-
-
- }
3>还是使用上面的测试类
运行结果:
------------------------------------------------------
煮开水
用水冲咖啡
倒进杯子
------------------------------------------------------
运行结果中没有添加配料
关于模板模式
1>模板模式定义了算法的步骤,把这些步骤的实现延迟到子类
2>模板模式为我们提供了一个代码复用的技巧
3>模板抽象类中可以定义具体方法、抽象方法和钩子方法
4>为了防止子类改变模板中的算法,可以将模板方法声明为final
5>钩子是一种方法,它在抽象类中不做事,或只做默认的事,子类可以选择要不要实现它
Template pattern模板方法模式
标签:
原文地址:http://www.cnblogs.com/wxishang1991/p/5220526.html