标签:
比别人多一点执着,你就会创造奇迹。
本讲内容:模板方法模式
一、模板方法模式 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
标签:
原文地址:http://blog.csdn.net/liguojin1230/article/details/46486059