这个可以类比填表单,事务的流程是清晰的,部分过程是抽象的,需要具体实现类自己实现。 
 
方法: 
用抽象基类定义框架 
1.创建抽象类 
—public abstract class RefreshBeverage 
2.创建模版方法 一定要用final因为要禁止子类对方法框架的覆写 
—public final void prepareBeverageTemplate() 
—boilWater(); 
—brew(); 
—pourInCup(); 
—addCondiments(); 
3.实现并私有化基本方法 
—private  
4.添加抽象的基本方法 
—protected abstract
钩子
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();
}
版权声明:本文为博主原创文章,未经博主允许不得转载。
原文:http://blog.csdn.net/gg_gogoing/article/details/47210369