设计模式(九)一看就懂的模版方法模式

  • 一文带你搞懂Java动态代理
  • 几分钟带你搞懂策略模式
  • 几分钟带你搞懂观察者模式
  • 一文彻底搞明白工厂和抽象工厂
  • 一文搞明白装饰者模式
  • 最全单例模式
  • 几段代码搞明白命令模式
  • 几段代码搞明白适配器模式
  • 一看就懂的外观模式
  • 一看就懂的模版方法模式

关于模版方法模式的定义,我就直接引用Head First了:模版方法模式在一个方法中定义了一个算法的骨架,而将一些步骤延迟到子类中。模版方法使得子类可以在不改变算法结构的情况下,重新定义算法中的某些步骤

这和前面说的策略模式很相似,但是策略模式是封装可替换的行为,然后使用组合的方式来决定采用哪一个行为,其意图是提供一组可替换的算法,让算法的变化独立于使用算法的客户,即用户可选择不同的算法。而我们的模版方法模式,是提供一个算法的大纲,而由子类来决定如何实现算法中的步骤,即用户可自行决定如何实现这套算法中的步骤,但却不能更换“不同的”算法。

模版方法模式

现在以线上购物流程为例,其大致步骤如下:
设计模式(九)一看就懂的模版方法模式_第1张图片

我们创建一个购物类,并将购物流程封装在一个方法内,这个方法就是模版方法模式里的“方法”二字了,细品下,为啥叫模版方法模式,而不是模版模式。我们可以将该方法使用 final 关键字修饰,以防止子类篡改算法模版。 能够注意到,该类是抽象类,其中包含 “下单” 和 “配送” 两个抽象方法,其意图就是由具体子类来决定实现的细节。不仅如此,“发货” 和 “收货” 两个方法,也体现了代码复用的思想。

public abstract class OnlineShopping {
    final void shoppingProcess {
        order(); // 下单
        delivery() // 发货
        distribution(); // 配送
        receipt(); // 收货
    }
    // 下单
    abstract void order(); 
    // 卖家发货
    void delivery() {
        System.out.println("卖家发货");
    }
    // 配送中
    abstract void distribution();
    // 买家收货
    void receipt() {
        System.out.println("买家货");
    }
}

来创建一个具体的某东商城购物类。JDShopping 实现了OnlineShopping 类的抽象方法,能够看出,我们并没有破坏掉算法模版,也没有改变算法的顺序,我们仅仅是给了某些步骤一些“符合自身”的具体的操作,即为某个步骤定义了不同的实现细节。

public class JDShopping extends OnlineShopping {
    @Override void order() {
        System.out.println("京东自营店铺下单");
    }
    @Override void distribution() {
        System.out.println("使用京东快递配送");
    }
}

同理,来创建一个具体的某宝商城购物类

public class TBShopping extends OnlineShopping {
    @Override void order() {
        System.out.println("淘宝小店下单");
    }
    @Override void distribution() {
        System.out.println("使用顺风快递配送");
    }
}

我们来执行一段测试程序

public class ClientTest {
    public static void main(String[] ags) {
        // 某东商城购物流程
        JDShopping jd = new JDShopping();
        jd.shoppingProcess();
        // 某宝商城购物流程
        TBShopping tb = new TBShopping();
        tb.shoppingProcess();
    }
}

你可能感兴趣的:(模式架构)