标签:
模板模式:
准备一个抽象类,讲部分逻辑以具体方法的形式实现,然后声明一些抽象方法交由子类实现剩余逻辑,用钩子方法给予子类更大的灵活性。最后将方法汇总构成一个不可改变的模板方法。
适用场景
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