标签:
模板模式:
准备一个抽象类,讲部分逻辑以具体方法的形式实现,然后声明一些抽象方法交由子类实现剩余逻辑,用钩子方法给予子类更大的灵活性。最后将方法汇总构成一个不可改变的模板方法。
适用场景
1 算法或操作遵循相似的逻辑
2 重构时(把相同的代码抽取到分类)
优势:
1 封装性好
2 复用性好
3 疲敝细节
4 便于维护
缺点
1 继承
源码:
RefreshBeverage
package com.imooc.pattern.template;
/**
* 抽象基类,为所有的子类提供一个算法框架
*/
public abstract class RefreshBeverage {
//制备饮料的模板方法,封装所有子类共同遵循的算法框架
public final void prepareBeverageTemplate(){
//1 将水煮沸
boilWater();
//2 炮制饮料
brew();
//3 将饮料倒入杯中
pourInCup();
if(isCustomerWantsCondiments()){
//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 isCustomerWantsCondiments() {
return true;
}
}
Coffee
package com.imooc.pattern.template;
/**
* 具体子类,提供了制备咖啡的具体实现
*/
public class Coffee extends RefreshBeverage {
@Override
protected void brew() {
System.out.println("用沸水冲泡咖啡");
}
@Override
protected void addCondiments() {
System.out.println("糖和牛奶");
}
}
Tea
package com.imooc.pattern.template;
/**
* 具体子类,提供茶的具体实现
*/
public class Tea extends RefreshBeverage {
@Override
protected void brew() {
System.out.println("80度的热水浸泡茶叶5分钟");
}
@Override
protected void addCondiments() {
System.out.println("加入柠檬");
}
/**
*
* 子类通过覆盖的形式选择挂载钩子函数
* @return
*/
@Override
protected boolean isCustomerWantsCondiments() {
return false;
}
}
RefreshBeverageTest
package com.imooc.pattern.template;
/**
* 测试类
*/
public class RefreshBeverageTest {
public static void main(String[] args) {
System.out.println("制备咖啡。。。");
RefreshBeverage b1 = new Coffee();
b1.prepareBeverageTemplate();
System.out.println("咖啡好了。。。");
System.out.println("/n*****************");
System.out.println("制备茶。。。");
RefreshBeverage b2 = new Tea();
b2.prepareBeverageTemplate();
System.out.println("茶好了。。。");
}
}
声明:慕课网学习笔记
标签:
原文地址:http://my.oschina.net/u/2361475/blog/497065