设计模式2-模板模式

来源:互联网 发布:linux导出mysql数据表 编辑:程序博客网 时间:2024/06/07 21:58

这个可以类比填表单,事务的流程是清晰的,部分过程是抽象的,需要具体实现类自己实现。
示例
方法:
用抽象基类定义框架
1.创建抽象类
—public abstract class RefreshBeverage
2.创建模版方法 一定要用final因为要禁止子类对方法框架的覆写
—public final void prepareBeverageTemplate()
—boilWater();
—brew();
—pourInCup();
—addCondiments();
3.实现并私有化基本方法
—private
4.添加抽象的基本方法
—protected abstract


  1. 定义一个公共的抽象父类
  2. 定义一个公共 final 的方法(封装所有子类都要遵循的算法框架)
  3. 算法框架中定义的方法子类实现相同的使用 private 修饰该方法并且实现,子类实现方法不一样的使用 protected abstact 修饰该方法并且不实现
  4. 让子类重写父类未实现的方法,实现各自的方法
  5. 在调用的实例对象采用 父类 实例名 = new 子类,在直接调用遵循的框架方法。
    实现钩子函数,以达到控制实现分支的作用.
    用钩子函数实现子类对算法框架个性化的扩展

钩子

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

/* * 抽象基类,为所有子类提供一个算法框架 *  * 提神饮料 */public abstract class RefreshBeverage {    /*     * 制备饮料的模板方法     * 封装了所有子类共同遵循的算法框架     */    public final void prepareBeverageTemplate(){        //步骤1 将水煮沸        boilWater();        //步骤2 泡制饮料        brew();        //步骤3 将饮料倒入杯中        pourInCup();        if(isCustomerWantsCondiments()){            //步骤4 加入调味料            addCondiments();        }    }    /*     * Hook, 钩子函数,提供一个默认或空的实现     * 具体的子类可以自行决定是否挂钩以及如何挂钩     * 询问用户是否加入调料     */     protected boolean isCustomerWantsCondiments() {        return true;    }    /*     * 基本方法,将水煮沸     */    private void boilWater() {        System.out.println("将水煮沸");    }    /*     * 基本方法,将饮料倒入杯中     */    private void pourInCup() {        System.out.println("将饮料倒入杯中");    }    /*     * 抽象的基本方法,泡制饮料     */    protected abstract void brew();    /*     * 抽象的基本方法, 加入调味料     */    protected abstract void addCondiments();}
0 0