大象放冰箱的艺术:模板方法模式

定义:模板方法模式的意图是,定义一个操作中的算法的骨架,而将一些步骤的实现延迟到子类中。模板方法使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。我们最常见的就是Spring框架里的各种Template。

举个栗子:把东西放到冰箱需要几步?

  1. 打开冰箱
  2. 把东西放到冰箱
  3. 关上冰箱

抽象类如下

public abstract class AbstractCarry {

    public abstract void open();

    public abstract void carry();

    public abstract void close();

    public void perform(){
        open();
        carry();
        close();
    }
} 

对于一个任务我们可以抽象出其流程来,具体实现交给子类。把苹果放进冰箱,把大象放进冰箱,我们可以把流程抽象出来,构建其骨架,三个步骤是一样的,具体实现由子类决定。如下是大象装冰箱的实现类

public class ElephantCarry extends AbstractCarry{
    @Override
    public void open() {
        System.out.println("----------打开冰箱----------");
    }

    @Override
    public void carry() {
        System.out.println("----------把大象放进去----------");
    }

    @Override
    public void close() {
        System.out.println("----------关上冰箱----------");
    }
}

执行

    public static void main(String[] args) {

        ElephantCarry elephantCarry = new ElephantCarry();
        elephantCarry.perform();

    }

运行结果

----------打开冰箱----------
----------把大象放进去----------
----------关上冰箱----------

这时我们又遇到一个问题,大象主动进入冰箱,不需要我们扔进去了,流程少了 carry() 方法,咋搞??

钩子方法

我们在抽象类定义一个判断标记,然后对外提供一个public方法来让外界设置这个判断标记,这就像是开关一样,想让它ture和false都行。这个法俗称钩子方法。

新版抽象方法如下

public abstract class AbstractCarry {

    public abstract void open();
    public abstract void carry();
    public abstract void close();

    public void perform(){
        open();
        if (needCarry()) {
            carry();
        }
        close();
    }

    /**
     *      钩子方法:是否需要扔进去
      * @return     默认返回 true
     */
    public boolean needCarry(){
        return true;
    }

} 

子类根据自身需求判断是否hook修改

总结:模板方法模式源码中用的比较多,开发中用的不是很多,多看源码拓宽思维,不错
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值