encapsulationalgorithm.java

来自「几个设计模式的java源码实例」· Java 代码 · 共 101 行

JAVA
101
字号
import java.io.*;

/*封装算法:
 * 在一个方法中定义一个算阿飞的框架,而将一些算法的具体步骤延迟到子类中实现,
 * 模板方法使得子类在不改变算法结构的情况下,重新定义算法中的某些步骤
 * 模板方法的抽象类可以定义具体方法,抽象方法和钩子。
 * 抽象方法供子类具体实现,钩子可以让子类实现算法中可选的部分
 * */

abstract class CaffeineBeverage{
	final void prepareRecipe(){	//声明为final方法,防止子类改变算法框架
		boilWater();
		brew();
		pourInCup();
		if(customerWantsCondiments()){	//钩子部分,控制实现算法框架中可选的部分
			addCondiments();
		}
	}
	
	//抽象方法在子类中具体实现
	abstract void brew();
	abstract void addCondiments();
	abstract String getUserInput();

	
	//公共方法,抽象出来在基类中实现,供子类继承
	void boilWater(){
		System.out.println("boiling Water");
	}
	void pourInCup(){
		System.out.println("pouring into cup");
	}
	boolean customerWantsCondiments(){
		String answer = getUserInput();
		if( answer.toLowerCase().startsWith("y") ){
			return true;
		}
		else{
			return false;
		}
	}
}

class Coffee extends CaffeineBeverage{
	void brew(){
		System.out.println("Dripping coffee through filter");
	}
	void addCondiments(){
		System.out.println("adding sugar and milk");
	}
	String getUserInput(){
		String answer = null;
		System.out.println("Would you like milk and sugar with your coffee (y/n)?");
		BufferedReader in  = new BufferedReader(new InputStreamReader(System.in));
		try{
			answer = in.readLine();
		}catch(IOException e){
			System.err.println("IO eror trying to read your answer");
		}
		if(answer==null){
			return "no";
		}
		return answer;
	} 
}

class Tea extends CaffeineBeverage{
	void brew(){
		System.out.println("Dripping tea through filter");
	}
	void addCondiments(){
		System.out.println("adding lemon");
	}
	String getUserInput(){
		String answer = null;
		System.out.println("Would you like lemon in your tea (y/n)?");
		BufferedReader in  = new BufferedReader(new InputStreamReader(System.in));
		try{
			answer = in.readLine();
		}catch(IOException e){
			System.err.println("IO eror trying to read your answer");
		}
		if(answer==null){
			return "no";
		}
		return answer;
	} 
}

public class EncapsulationAlgorithm {
	public static void main(String[] args) {
		Coffee coffee = new Coffee();
		Tea tea = new Tea();
		System.out.println("\nmaking coffee...");
		coffee.prepareRecipe();
		
		System.out.println("\nmaking coffee...");
		tea.prepareRecipe();
	}
}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?