现在的位置: 首页 > 综合 > 正文

模板方法模式

2018年05月04日 ⁄ 综合 ⁄ 共 1661字 ⁄ 字号 评论关闭

模板方法

1.定义

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

2.类图


3.例子

咖啡因饮料
        茶和咖啡都是咖啡因饮料,它们的冲泡方法也很相似:
   星巴兹咖啡冲泡法               星巴兹茶冲泡法
 ⑴ 把水煮沸                          ⑴ 把水煮沸
 ⑵ 用沸水冲泡咖啡               ⑵ 用沸水浸泡茶叶
 ⑶ 把咖啡倒进杯子               ⑶ 把茶倒进杯子
 ⑷ 加糖和牛奶                      ⑷ 加柠檬


a.不使用模板方法时

   Coffee类

public class Coffee extends CaffeineBeverage{ 
       void prepareRecipe() {
	boilWater();
	brewCoffeeGrinds();
	pourInCup();
	addSugarAndMilk();
       } 
       public void brewCoffeeGrinds() 
       { System.out.println("Dripping Coffee through filter"); }
     
       public void addSugarAndMilk() 
       { System.out.println("Adding Sugar and Milk"); }}

     Tea类

public class Tea { 
       void prepareRecipe() extends CaffeineBeverage{
	boilWater();
	steepTeaBag();
	pourInCup();
	addLemon();
       } 
       
       public void steepTeaBag() 
       { System.out.println("Steeping the tea"); } 
       public void addLemon() 
       { System.out.println("Adding Lemon"); }
  }

      CaffeineBeverage类

public class CaffeineBeverage{
	abstract void prepareRecipe();
	void boilWater()
	{
		System.out.println("Boiling water....");
	}
	void pourInCup()
	{
		System.out.println("Pouring into the cup");
	}
	
}

b.使用模板方法时

CaffeineBeverage(咖啡因饮料)超类:

public abstract class CaffeineBeverage {  // 抽象类
	final void prepareRecipe() {
	      boilWater();
	      brew();
	      pourInCup();
	      addCondiments();
	} 
	abstract void brew();  
	abstract void addCondiments(); 
	void boilWater() {
	      System.out.println("Boiling water");
	}  
	void pourInCup() {
	      System.out.println("Pouring into cup");
	}

咖啡和茶都依赖于超类(咖啡因饮料)处理冲泡法

public class Coffee extends CaffeineBeverage {
	public void brew() {
	      System.out.println("Dripping Coffee through filter");
	}
	public void addCondiments() {
	      System.out.println("Adding Sugar and Milk");
	}
     }
public class Tea extends CaffeineBeverage {
	public void brew() {
	      System.out.println("Steeping the tea");
	}
	public void addCondiments() {
	      System.out.println("Adding Lemon");
	}
     }







抱歉!评论已关闭.