设计模式模版方法模式(TemplateMethodPattern)

核心模块:AbstractClass抽象类、ConcreteClass具体类
所有代码请访问:git@code.aliyun.com:289804201/PatternLearn.git
目的:提供一个算法框架,使得相同的算法框架可以有不同的执行结果:
使用场景:对复杂的算法进行分割,不变的部分保存到父类中,细节改变由子类来实现;
优点:代码复用,符合opc开放封闭原则,行为可扩展,控制子类的扩展;
缺点:如果子类太多,导致类的个数增加,系统变得庞大;

注意:为了防止子类改变算法的实现步骤,我们可以将模板方法的申明为final;

代码实例:
public class TemplateMethodPattern {
    public static void main(String[] args) {
        HotCoffee coffee = new HotCoffee();
        coffee.getHotDrinks();
        System.out.println();

        HotTea tea1 = new HotTea(){
            @Override
            public boolean customerNeedCondiments() {
                return false;
            }
        };
        tea1.getHotDrinks();
        System.out.println();

        HotTea tea2 = new HotTea();
        tea2.getHotDrinks();
        System.out.println();
    }
}

//Abstract算法抽象类
abstract class absHotDrinks {
    //烧水
    private void boilWater() {
        System.out.println("boilWater()...");
    }

    //冲调料
    protected abstract void brew();

    //倒入被子
    private void putInCup() {
        System.out.println("putInCup()...");
    }

    //加调料
    protected abstract void addCondiments();

    //钩子,控制父类,用户是否要加调料
    public boolean customerNeedCondiments() {
        return true;
    }

    //具体算法放放,防止子类改变算法步骤
    public final void getHotDrinks() {
        boilWater();
        brew();
        putInCup();
        if (customerNeedCondiments()) {
            addCondiments();
        }
    }
}

class HotCoffee extends absHotDrinks{
    @Override
    protected void brew() {
        System.out.println("now add coffee...");
    }

    @Override
    protected void addCondiments() {
        System.out.println("now coffee add milk and sugar...");
    }
}

class HotTea extends absHotDrinks{
    @Override
    protected void brew() {
        System.out.println("now add tea...");
    }

    @Override
    protected void addCondiments() {
        System.out.println("now tea add sugar...");
    }
}
内容打印
Hello World!
boilWater()...
now add coffee...
putInCup()...
now coffee add milk and sugar...

boilWater()...
now add tea...
putInCup()...

boilWater()...
now add tea...
putInCup()...
now tea add sugar...



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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值