用最通俗易懂的例子来谈模板方法模式

模板方法模式是什么?

简单来说,就是把重复的方法或固定的行为顺序封装成接口,个性部分由子类来实现即可!

通过案例来理解模板方法模式

通过银行取款或者存款的流程(取号,等待,取款/存款,评价)来理解模板方法模式!

在这里插入图片描述

1、首先定义父类,来吧一些公共的方法,行为顺序抽象出来!

/**
 * 父类:定义一些公共的方法及行为!
 *   公共方法:取号,等待,评价
 *   需要子类实现的方法:存款/取款
 *   行为:第一步取号,第二步等待,第三步存款/取款,第四步:评价
 */
abstract class Business{
    private Integer serialNo;
    /**
     * 取号
     */
    public final void takeNumber(){
        System.out.println("我来取号了~~~");
        Random random = new Random();
        this.serialNo = random.nextInt(100);
        System.out.println("取到的号码为:" + this.serialNo);
    }

    /**
     * 等待
     * @param serialNo
     */
    public final void waiting(Integer serialNo){
        System.out.println(serialNo.intValue() + "号,在等待被叫那~~~");
    }

    /**
     * 需要子类实现的存取款
     * @param serialNo
     */
    abstract void sonShowTime(Integer serialNo);

    /**
     * 钩子函数,用来逻辑判断,给个默认值,防止程序报错!
     * @return
     */
    public Boolean isGoodEvaluate(){
        return true;
    }

    public final void evaluate(Integer serialNo){
        if (isGoodEvaluate()){
            System.out.println(serialNo.intValue() + "号给了五星好评!");
        }else{
            System.out.println(serialNo.intValue() + "号给了差评差评差评!");
        }
    }

    /**
     * 流程顺序
     */
    public final void process(){
        this.takeNumber();
        this.waiting(serialNo);
        this.sonShowTime(serialNo);
        this.evaluate(serialNo);
    }
}

2、子类根据自己的需要来实现相应的功能

/**
 * 存款
 */
class Deposit extends Business{

    @Override
    void sonShowTime(Integer serialNo) {
        System.out.println(serialNo + "号来存款了~");
    }

    @Override
    public Boolean isGoodEvaluate(){
        return true;
    }
}

/**
 * 取款
 */
class WithdarwMoney extends Business{

    @Override
    void sonShowTime(Integer serialNo) {
        System.out.println(serialNo + "号来取款了~");
    }

    @Override
    public Boolean isGoodEvaluate(){
        return false;
    }
}

3、测试调用

public class TemplateDemo {
    public static void main(String[] args) {
        Deposit deposit = new Deposit();
        deposit.process();

        System.out.println("-------------------------");

        WithdarwMoney withdarwMoney = new WithdarwMoney();
        withdarwMoney.process();
    }
}

在这里插入图片描述


模板方法模式的优缺点有哪些?

优点:

  • 行为统一由父类控制,子类来实现细节,符合开闭原则!
  • 通过抽取重复部分,提高了代码的复用性

缺点:

  • 如果父类添加新的方法,则可能造成牵一发而动全身
  • 如果子类太多,会提升阅读的复杂性



感谢大家的阅读,我是爱你三千遍,一个喜欢把简单问题复杂化,把复杂问题简单化的程序猿!

参考博客一
参考博客二

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值