文章目录

  • 一、 模板设计模式在书中定义:
  • 二、 模板模式的类图:
  • 三、 实例说明
  • 四、 特性


一、 模板设计模式在书中定义:

定义一个操作中算法的骨架,而将一些步骤延迟到子类中,模板方法使得子类可以不改变算法的结构但可重定义该算法的某些特定步骤。

通俗点的理解就是 :完成一件事情,有固定的数个步骤,但是每个步骤根据对象的不同,而实现细节不同;就可以在父类中定义一个完成该事情的总方法,按照完成事件需要的步骤去调用其每个步骤的实现方法。每个步骤的具体实现,由子类完成。

二、 模板模式的类图:

抽象父类(AbstractClass):实现了模板方法,定义了算法的骨架。

具体类(ConcreteClass):实现抽象类中的抽象方法,即不同的对象的具体实现细节。

  

JAVA设计模式之模版模式_System

三、 实例说明

来举个例子: 比如我们买东西可以分为三个步骤 (1)选东西下订单 (2)减库存 (3)买单,这三部就是算法的骨架 ;然而买不同的东西需要的根据东西下订单,减不同的库存,用不同的方式支付,这个就是不同的实现细节。

下来我们就代码实现如下:
1、先来写一个抽象的购买流程

/**
 * 模版模式
 */
public abstract class ShoppingTemplate {
    protected void buy(){
        this.placingOrder();
        this.reduceStock();
        this.pay();
        System.out.println("购买成功");
    }

    /**
     * 下订单
     */
    public abstract void placingOrder();


    /**
     * 减库存
     */
    public abstract void reduceStock();

    /**
     * 支付
     */
    public abstract void pay();

}

2、买鞋和买衣服实现父类中的抽象方法

public class BuyShoes extends ShoppingTemplate {
    @Override
    public void placingOrder() {
        System.out.println("我要下订单买衣服");
    }

    @Override
    public void reduceStock() {
        System.out.println("去衣服库拿鞋");
    }

    @Override
    public void pay() {
        System.out.println("微信支付买衣服的钱");
    }
}
public class BuyTshirt extends ShoppingTemplate {
    @Override
    public void placingOrder() {
        System.out.println("我要下订单买鞋");
    }

    @Override
    public void reduceStock() {
        System.out.println("去鞋库拿鞋");
    }

    @Override
    public void pay() {
        System.out.println("支付宝支付买鞋的钱");
    }
}

3、在测试类中买东西:

public class Test {
    public static void main(String[] args) {
        BuyShoes buyShoes = new BuyShoes();
        buyShoes.buy();
        BuyTshirt buyTshirt = new BuyTshirt();
        buyShoes.buy();
    }
}

测试结果:

我要下订单买衣服
去衣服库拿鞋
微信支付买衣服的钱
购买成功
我要下订单买衣服
去衣服库拿鞋
微信支付买衣服的钱
购买成功

这样就实现了使用模板模式的一个完整的实例。

四、 特性

(一)优点
1、封装不变部分,扩展可变部分。
2、提取公共代码,便于维护。
3、行为由父类控制,子类实现。
(二)不足
每一个不同的实现都需要一个子类来实现,导致类的个数增加,使得系统更加庞大。

(三)使用场景
1、有多个子类共有的方法,且逻辑相同。
2、重要的、复杂的方法,可以考虑作为模板方法。

(四)特点
侧重的点不是选择,你没得选择,你必须按照这个流程做没,但是你可以参与某一部分内容进行自定义。