java设计模式之模板模式

在面向对象的开发过程中,通常会遇到这样一个问题,我们知道一个算法所需的关键步骤,并确定了这些步骤的执行顺序,但是,某些步骤的具体实现是未知的,或者说某些步骤的实现会随着环境的变化而改变。
以泡茶和泡咖啡的例子来理解一下。
泡咖啡的步骤:

  1. 水烧开
  2. 冲泡咖啡粉
  3. 把咖啡倒入被子
  4. 加糖和加牛奶

泡茶步骤:

  1. 水烧开
  2. 冲泡茶叶
  3. 把茶水倒入被子
  4. 加柠檬

首先写好执行这两个步骤的类:
咖啡

public class Coffee {

    public void prepareRecipe(){
        boilWater();
        brewCoffee();
        pourInCup();
        addSugarMilk();
    }

    public void boilWater(){

    }

    public void brewCoffee(){

    }

    public void pourInCup(){

    }

    public void addSugarMilk(){

    }

}

茶:

public class Tea {

    public void prepareRecipe(){
        boilWater();
        brewTea();
        pourInCup();
        addLemon();
    }

    public void boilWater(){

    }

    public void brewTea(){

    }

    public void pourInCup(){

    }

    public void addLemon(){

    }

}

变化与不变,我们发现在这两个类里面水烧开和将水倒入被子的方法是一样的,所以这两个就可以抽象出来放到公共类里面。

public abstract class HotDrink {

    public abstract void prepareRecipe();

    public void boilWater(){

    }
    public void pourInCup(){

    }
}

同时我们发现不仅这两个方法是一样的,而且冲泡的步骤也是一样的,同样我们也可以抽象出来。

public abstract class HotDrink {

    public final void prepareRecipe(){
        boilWater();
        brew();
        pourInCup();
        addCondiments();
    }

    public abstract void brew();

    public abstract void addCondiments();

    public final void boilWater(){

    }
    public final void pourInCup(){

    }
}

这样模板基本完成了。子类只要关心抽象函数的实现就可以了,他不需要关心步骤和公共的方法。
其实模板模式就是封装了一个算法步骤,并允许子类为一个或多个步骤方法提供实现。模板模式可以使子类在不改变算法结构的情况下,重新定义算法中的某些步骤。
总感觉上面写的还不够灵活 ,要想子类可以控制父类的步骤 怎么办呢?

public abstract class HotDrink {

    public final void prepareRecipe(){
        boilWater();
        brew();
        pourInCup();
        if(wantCondimentsHook()) {
            addCondiments();
        }else{
            Log.i("","No Condiments");
        }
    }

    public boolean wantCondimentsHook(){
        return true;
    }

    public abstract void brew();

    public abstract void addCondiments();

    public final void boilWater(){

    }
    public final void pourInCup(){

    }
}

子类可以通过重写wantCondimentsHook()这个方法来改变返回值 从而改变父类的步骤。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值