首页 > 代码库 > 模板方法模式之抽象类继承

模板方法模式之抽象类继承

  1. Test.java

package com.demo_type.pattern.template;

public class Test {

	public static void main(String[] args) {
		
		System.out.println("制备咖啡...");
		RefreshBeverage coffee = new Coffee();
		coffee.prepareBeverageTemplate();
		System.out.println("客官,咖啡好了...");
		
		System.out.println("**************************");
		System.out.println("制备茶...");
		RefreshBeverage tea = new Tea();
		tea.prepareBeverageTemplate();
		System.out.println("客官,您要的上等好茶好了...");
	}

}

2.  RefreshBeverage.java (提神饮料)

package com.demo_type.pattern.template;

/**
 * @author YBnew
 * 抽象基类,为所有子类提供一个算法框架
 * 
 * 提神饮料
 */
public abstract class RefreshBeverage {
	
	/*
	 * 制备饮料的模板方法
	 * 封装所有子类共同遵循的算法框架
	 */
	public final void prepareBeverageTemplate(){
		//step1. 将水煮沸
		boilWater();
		//step2.  泡制饮料
		brew();
		//step3. 将饮料倒入杯中
		pourInCup();
		//setp4. 加入调味料
		if(isCustomerWantsCondiments()){
			addCondiments();
		}
	}

	/*
	 * 基本方法,降水煮沸,父子类行为都一样,所以设为private,
	 */
	private void boilWater() {
		
		System.out.println("将水煮沸");
	}
	
	/*
	 * 抽象的基本方法,泡制饮料
	 * --话说这里能将protected 变为public么?当然不要这样了,这样到处都能访问这个类和这个抽象方法了
	 */
	protected abstract void brew();
	
	/*
	 * 基本方法,倒入的动作,父子类行为都一样,所以设为private,
	 */
	private void pourInCup() {
		// TODO Auto-generated method stub
		System.out.println("将水倒入杯中");

	}
	
	/*
	 * 抽象的基本方法,加入冲泡元素
	 */
	protected abstract void addCondiments();
	
	/*
	 * Hook
	 * 钩子函数,提供一个空的或默认的实现
	 * 具体的子类可以自行决定是否挂钩以及如何挂钩
	 * 
	 * 功能: 询问用户是否加调料,继承访问权限
	 */
	protected boolean isCustomerWantsCondiments(){
		return true;
	}
	
}

3.Coffee.java

package com.demo_type.pattern.template;

public class Coffee extends RefreshBeverage{

	@Override
	protected void brew() {
		
		System.out.println("用沸水冲泡咖啡");
	}

	@Override
	protected void addCondiments() {
		
		System.out.println("加入糖和牛奶");
	}
	

}

4.Tea.java

package com.demo_type.pattern.template;

public class Tea extends RefreshBeverage{

	@Override
	protected void brew() {
		
		System.out.println("89度泡5分钟");
		
	}

	@Override
	protected void addCondiments() {
		
		
		System.out.println("加入柠檬");
	}
	//如果不想要加柠檬
	
	@Override
	protected boolean isCustomerWantsCondiments(){
		return false;
	}
	
}


模板方法模式之抽象类继承