Template设计模式

来源:互联网 发布:手机淘宝优惠券转化 编辑:程序博客网 时间:2024/05/23 22:09

前言:著名的好莱坞原则,即don't  call me ,i  will call  you,模板设计模式就是遵循这一原则的

一、使用场合:

模板设计模式:一些事物流程是固定,流程中的具体步骤有的是固定的实现,有的步骤有不同的实现,

二、基本思路以及实例:

定义一个抽象类Drink,Coffee类和Tea类继承该类,在Drink类中定义一个generateProcess方法,包含了饮料冲泡的流程(固定),以及具体的boil(),addMaterial()等方法(有的固定有的不固定)

其中使用到了钩子函数isCustomerWant(),用于控制某个步骤是否要在子类中实现。

钩子函数:在父类中提供一个默认实现,具体控制在子类中实现

三、具体代码 

package com.dp.template;


public abstract class Drink {
  protected void generateProcess(){
  boil();
  addMaterial();
  addWater();
  if(isCustomerWant()){
  addIngrediant();
  }
  }
  
  public boolean isCustomerWant() {
// TODO Auto-generated method stub
return true;
}


//烧水,共有步骤
  public void  boil(){
  System.out.println("将水烧开。。。");
  }
  //放入原料,自定义步骤
  public abstract void  addMaterial();
  //加水冲泡饮料
  public  void  addWater(){
  System.out.println("开始冲泡");
  }
  //添加调味,自定义步骤
  public abstract void  addIngrediant();


}


package com.dp.template;


public class Coffee extends Drink {


@Override
public void addIngrediant() {
// TODO Auto-generated method stub
System.out.println("加入牛奶");


}


@Override
public void addMaterial() {
// TODO Auto-generated method stub
System.out.println("放入咖啡豆");


}


}



package com.dp.template;


public class Tea extends Drink {


@Override
public void addIngrediant() {
// TODO Auto-generated method stub
System.out.println("加入柠檬");


}


@Override
public void addMaterial() {
// TODO Auto-generated method stub
System.out.println("放入茶叶");


}


@Override
public boolean isCustomerWant() {
// TODO Auto-generated method stub
return false;
}



}


package com.dp.template;


public class Client {


/**
* @param args
*/
public static void main(String[] args) {
//冲咖啡
System.out.println("开始泡咖啡");
Drink  dk  =  new  Coffee();
dk.generateProcess();
System.out.println("咖啡泡好了");
System.out.println();
//泡茶
System.out.println("开始泡茶");
dk = new Tea();
dk.generateProcess();
System.out.println("茶泡好了");
}


}



0 0