模板方法模式

比别人多一点执着,你就会创造奇迹。


本讲内容:模板方法模式 


一、模板方法模式 Template 介绍

模板方法模式定义了一个操作中的算法骨架,而将一些步骤延迟到子类中实现,使得子类可以在不改变一个算法结构的同时,就重新定义该算法的某些特定步骤。


二、用抽象基类定义框架

1.创建抽象类
---public abstract class Beverage
2.创建模版方法
---public final void prepareBeverageTemplate()
---boilWater();
---brew();
---pourInCup();
---addCondiments();
3.实现并私有化基本方法(固定的)
---private 
4.添加抽象的基本方法(知道具体原则,不确定实现细节,由子类实现)
---protected abstract       protected 使其他类(非继承的)不可直接调用


三、用钩子函数实现子类对算法框架个性化的扩展
1、思想:框架通过提供一个个的钩子,使框架具备了更大的灵活性。不想执行算法框架中的某些个步骤,我们可以脱钩,如果想执行的话,我们可以挂钩。
2、实现:在抽象类中,提供protected钩子方法。这是个实现的或空的方法。这样子类就可以选择覆写-持钩,也可以选择不覆写-脱勾。
3、使用:提供一个isXXX类型的钩子方法。用该方法控制算法框架中
4、某个步骤是否执行:子类不覆写这个方法,就是脱钩,仍按框架逻辑执行,一旦覆写,就是挂钩,将改变框架算法方向,按子类逻辑执行。


示例一:饮料泡法
1、把水煮沸(boilWater)   固定的
2、泡饮料(brew) 可变的(不知其泡什么饮料) 知道具体原则,不确定实现细节,使子类实现
3、把饮料倒进杯子(pourInCup) 固定的
4、加调味料(addCondiments) 可变的(不知其加什么味料)

/*
 * 抽象基类,为所有子类提供一个算法框架
 * 
 * 饮料
 */
public abstract class Beverage {

	/*
	 * 制备饮料的模板方法 封装了所有子类共同遵循的算法框架
	 */
	public final void prepareBeverageTemplate() {
		// 步骤1 将水煮沸
		boilWater();
		// 步骤2 泡制饮料
		brew();
		// 步骤3 将饮料倒入杯中
		pourInCup();
		if(isCondiments()){
			//步骤4 加入调味料
			addCondiments();
		}
	}

	/*
	 * 基本方法,将水煮沸
	 */
	private void boilWater() {
		System.out.println("将水煮沸");
	}

	/*
	 * 抽象的基本方法,泡制饮料
	 */
	protected abstract void brew();

	/*
	 * 基本方法,将饮料倒入杯中
	 */
	private void pourInCup() {
		System.out.println("将饮料倒入杯中");
	}
	
	/*
	 * 抽象的基本方法, 加入调味料
	 */
	protected abstract void addCondiments();
	
	/*
	 * Hook, 钩子函数,提供一个默认或空的实现
	 * 具体的子类可以自行决定是否挂钩以及如何挂钩
	 * 询问用户是否加入调料
	 */
	protected boolean isCondiments(){
		return true;
	}
}

/*
 * 具体子类,提供了咖啡制备的具体实现
 */
public class Coffee extends Beverage {
	
	protected void brew() {
		System.out.println("用沸水冲泡咖啡");
	}

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

/*
 * 具体子类,提供了制备茶的具体实现
 */
public class Tea extends Beverage {

	protected void brew() {
		System.out.println("用80度的热水浸泡茶叶5分钟");
	}

	protected void addCondiments() {
		System.out.println("加入柠檬");
	}
	
	/*
	 * 子类通过覆盖的形式选择挂载钩子函数(返回 false 使饮料不添加味料)
	 */
	protected boolean isCondiments() {
		return false;
	}
}

/**
 * 测试
 */
public class Test {
	public static void main(String[] args) {
		System.out.println("制备咖啡...");
		Beverage b1=new Coffee();
		b1.prepareBeverageTemplate();
		System.out.println("咖啡好了!");
		
		System.out.println("\n******************************************");
		
		System.out.println("制备茶...");
		Beverage b2=new Tea();
		b2.prepareBeverageTemplate();
		System.out.println("茶好了!");
	}
}
打印:

制备咖啡...
将水煮沸
用沸水冲泡咖啡
将饮料倒入杯中
加入糖和牛奶
咖啡好了!


******************************************
制备茶...
将水煮沸
用80度的热水浸泡茶叶5分钟
将饮料倒入杯中
茶好了!



Take your time and enjoy it 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值