【设计模式】模板模式

756 阅读1分钟

模式介绍

通过抽象类定义了一个模板,子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。

示例(购买商品)

购买商品的过程都会经过选择商品,支付,物流,签收。

首先定义一个购买商品流程的抽象类

public abstract class BaseBuyGoodsTemplate {

    /**
     * 商品选择
     *
     * @return
     */
    protected abstract void chooseGoods();

    /**
     * 商品支付
     *
     * @return
     */
    protected abstract void payGoods();

    /**
     * 商品邮寄
     *
     * @return
     */
    protected abstract void postGoods();

    /**
     * 商品签收
     *
     * @return
     */
    protected abstract void receiveGoods();

    public final void buyGoods() {
        chooseGoods();
        payGoods();
        postGoods();
        receiveGoods();
    }
}

A平台购买商品

@Service
public class ABuyGoodsImpl extends BaseBuyGoodsTemplate {
    @Override
    protected void chooseGoods() {
        System.out.println("A平台选择商品");
    }

    @Override
    protected void payGoods() {
        System.out.println("A平台支付商品");
    }

    @Override
    protected void postGoods() {
        System.out.println("A平台邮寄商品");
    }

    @Override
    protected void receiveGoods() {
        System.out.println("A平台签收商品");
    }
}

B平台购买商品

@Service
public class BBuyGoodsImpl extends BaseBuyGoodsTemplate {

    @Override
    protected void chooseGoods() {
        System.out.println("B平台选择商品");
    }

    @Override
    protected void payGoods() {
        System.out.println("B平台支付商品");
    }

    @Override
    protected void postGoods() {
        System.out.println("B平台邮寄商品");
    }

    @Override
    protected void receiveGoods() {
        System.out.println("B平台签收商品");
    }
}

测试

public static void main(String[] args) {
    BaseBuyGoodsTemplate a = new ABuyGoodsImpl();
    a.buyGoods();
    BaseBuyGoodsTemplate b = new BBuyGoodsImpl();
    b.buyGoods();
}

image.png

优缺点

优点

  1. 将不变的部分进行封装,可变的部分可自行扩展;
  2. 提取公共代码,开发人员维护比较方便。
  3. 由父类控制行为,子类实现。

缺点

每一个实现都需要一个子类,后期系统会越来越庞大