行为型模式之模板方法模式

概述

一般的,当我们在设计某个需求的时候总要考虑到两种角色的实现方式不同——即普通用户和管理员用户,但因为它们不少代码是可以重用的,我们不由的将两者纠缠其中增加了耦合,亦或者使将两者隔离开产生了大量的代码冗余。

为了解决这种问题,我们可以借用「模板方法模式」的思维进行设计。模板方法模式的定义即「解决设计一个系统知道了算法所需的关键步骤,且确定这些顺序,但其中实现方式不清楚」

整体

首先,我们抽象出一个例子。假设我们需要实现一个做饭的需求,那么我们每一次做饭的基本步骤是:

  • 1.起火烧油
  • 2.倒入蔬菜(肉)
  • 3.撒上调料
  • 4.大火收汁

写到这里你应该发现了,这些个流程我们是蛮熟悉的,可是具体放什么菜(肉)?具体放什么调料? 不得而知了吧。但步骤一和四可以被复用的。因此,我们可以借助模板方法模式的形式去解决这个问题。

代码

其实,这个实现方法很简单,我们只需要创建一个抽象类,然后把双方共用的方法直接实现,而其他非共用的方法则编写为抽象方法。

public abstract class Cook {

    public final void start(){
        burningOil();
        putFood();
        Seasoning();
        over();
    }

    /**
     * 起锅烧油
     */
    public void burningOil(){
        System.out.println("起锅烧油~");
    }
    /**
     * 倒入蔬菜(肉)
     */
    public abstract void putFood();
    /**
     * 撒上调料
     */
    public abstract void Seasoning();
    /**
     * 大火收汁
     */
    public void over(){
        System.out.println("大火收汁~");
    }
}

然后,我们再去实现一个「实现类」,我们要做的饭是「孜然(猪)肉」(啊啊啊我贼喜欢吃哈哈哈,但是最近减肥)。

public class ZiRanZhuRou extends Cook {

    @Override
    public void putFood() {
        System.out.println("放入猪肉~");
    }

    @Override
    public void Seasoning() {
        System.out.println("撒上孜然~");
    }

    public static void main(String[] args) {
        new ZiRanZhuRou().start();
    }
}

只需要继承一下「做饭」的抽象类就好啦。