设计模式--模板模式

                            设计模式--模板模式

 

模板模型原理

泡咖啡与泡茶的算法
泡咖啡步骤:                        泡茶步骤:
水烧开                                   水烧开
冲泡咖啡粉                            冲泡茶叶
把咖啡倒入杯子                     把茶水倒入杯子
加糖和牛奶                            加柠檬


思考   变化与不变化
代码讲解
Coffee 


public class Coffee {
	public void prepareRecipe() {
		boilWater();
		brewCoffee();
		pourInCup();
		addSugarMilk();
	}
	
	public void boilWater(){
		System.out.println("boilWater");
	}
	public void brewCoffee(){
		System.out.println("brewCoffee");
	}
	public void pourInCup(){
		System.out.println("pourInCup");
	}
	public void addSugarMilk(){
		System.out.println("addSugarMilk");
	}
}

Tea 


public class Tea {
	
	public void prepareRecipe() {
		boilWater();
		brewTea();
		pourInCup();
		addLemon();
	}
	public void boilWater(){
		System.out.println("boilWater");
	}
	public void brewTea(){
		System.out.println("brewTea");
	}
	public void pourInCup(){
		System.out.println("pourInCup");
	}
	public void addLemon(){
		System.out.println("addLemon");
	}
	
	
}

 MainTest


public class MainTest {

	public static void main(String[] args) {
		Coffee mCoffee = new Coffee();
		Tea mTea = new Tea();
		mCoffee.prepareRecipe();
		mTea.prepareRecipe();
	}
}


抽象冲泡算法

设计模式--模板模式


HotDrink 


public abstract class HotDrink {
	
	public abstract void prepareRecipe();
	
	public void boilWater() {
		System.out.println("boilWater");
	}
	
	public void pourInCup() {
		System.out.println("pourInCup");
	}
}


模板模式的原理和设计
设计模式--模板模式

模板模式:封装了一个算法步骤,并允许子类为一个或多个步骤方法提供实现。模板模式可以使子类在不改变算法结构的
情况下,重新定义算法中的某些步骤
代码讲解

HotDrink 


public abstract class HotDrink {
	
	public final void prepareRecipe(){
		boilWater();
		brew();
		pourInCup();
		addCondiments();
	}
	
	public final void boilWater() {
		System.out.println("boilWater");
	}
	
	public final void pourInCup() {
		System.out.println("pourInCup");
	}
	
	public abstract void brew();
	
	public abstract void addCondiments();
	
	
}


Coffee 


public class Coffee extends HotDrink{
	public void brew() {
		System.out.println("brewing coffee");
	}
	
	public void addCondiments() {
		System.out.println("Adding sugar and milk");
	}

}


MainTest 


public class MainTest {

	public static void main(String[] args) {
		HotDrink mCoffee = new Coffee();
		HotDrink mTea = new Tea();
		mCoffee.prepareRecipe();
		mTea.prepareRecipe();
	}
}


设计模式--模板模式

hook()方法可以重写,也可以选择不重写

HotDrink 


public abstract class HotDrink {
	
	public final void prepareRecipe() {
		boilWater();
		pourInCup();
		brew();
		if(wantCondimentsHook()) {
			addCondimentsHook();
		}else {
			System.out.println("No Condiments");
		}
	}
	
	public boolean wantCondimentsHook() {
		return true;
	}
	
	public final void boilWater() {
		System.out.println("boilWater");
	}
	
	public final void pourInCup() {
		System.out.println("pourInCup");
	}
	
     public abstract void brew();
	
	public abstract void addCondimentsHook();
}

TeaWithHook  

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;


public class TeaWithHook extends HotDrink{

	public boolean wantCondimentsHook() {
		System.out.println("Cndiments, yes or no?please input(y/n):");
		BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
		String result = "";
		try {
			result = in.readLine();
		}catch(IOException e) {
			e.printStackTrace();
		}
		if(result.equals("n")){
			return false;
		}else {
			return true;
		}
	}
	
	@Override
	public void brew() {
		System.out.println("brew Tea");
		
	}

	@Override
	public void addCondiments() {
		System.out.println("adding lemon");
	}

	
}


身边模板模式

排序鸭子
数组内置的sort版本
Comparable版本

Duck 


public class Duck implements Comparable{

	 String name = "";
	 int weight = 1;
	 public Duck(String name, int weight) {
		 this.name = name;
		 this.weight = weight;
	 }
	 
	 public String toString() {
		 return name + "weight:" + weight;
	 }
	 
	 public int compareTo(Object arg0) {
		 Duck buf = (Duck)arg0;
		 if(this.weight > buf.weight) {
			 return 1;
		 }else if(this.weight < buf.weight) {
			 return -1;
		 }
		 return 0;
	 }
}

进行排序

Duck[] ducks = new Duck[10];
for(int i = 0; i < 10; i++) {
       ducks[i] = new Duck();
       //添加数据
}
Arrays.sort(duck); 

好莱坞原则
好莱坞原则:别调用我们,我们会调用你(经纪人)
意义:高层无需知道调用底层的细节,解耦