美文网首页
(十四)模板方法模式

(十四)模板方法模式

作者: feiry | 来源:发表于2019-08-10 15:11 被阅读0次

现在水果店不断扩展支付方式,但是不想影响主流程


扩展支付方式

模板方法模式

模板示意图

对于未知的方法,在主流程中,使用抽象方法代替,具体实现,在具体使用的时候就知道了

/**
 * 模板方法模式
 * 购物车费用结算过程
 */
public abstract class ShoppingCart {
    private Discount discount;
    private List<Fruit> products = new ArrayList<>();

    public ShoppingCart(List<Fruit> products){
        this.products = products;
    }

    public void setDiscount(Discount discount) {
        this.discount = discount;
    }

    //提交订单主流程
    public void submitOrder(){
        //计算商品金额
        int money = balance();
        System.out.println("商品总金额为:"+money+"元");

        //优惠减免
        money = discount.calculate(money);
        System.out.println("优惠减免后:"+ money+"元,");

        //保存订单
        pay(money);

        //送货上门
        sendHome();

    }

    //计算金额
    private int balance(){
        int money = 0;
        System.out.print("商品清单:");
        for (Fruit fruit : products){
            fruit.draw();
            System.out.print(",");
            money += fruit.price();
        }
        return money;
    }

    private void sendHome(){
        System.out.println("三公里以内,免费送货上门");
    }

    //提交保存
    protected abstract void pay(int money);

}

在主流程中,pay方法是未知的,需要子类实现它,这样利用Java多态的特性,不影响主流程并且能够方便扩展新的实现功能

/**
 * 模板方法模式
 * 购物车费用结算过程
 */
public class OtherPayShopping extends ShoppingCart{


    public OtherPayShopping(List<Fruit> products) {
        super(products);
    }

    @Override
    protected void pay(int money) {
        System.out.println("代付成功");
    }

}
/**
 * 模板方法模式
 * 订单费用结算过程
 */
public class ShoppingCartClient {

    public static void main(String[] args) {
        List<Fruit> products = new ArrayList();

        products.add(StaticFactory.getFruitApple());
        products.add(StaticFactory.getFruitBanana());
        products.add(StaticFactory.getFruitOrange());

        ShoppingCart cart = new OtherPayShopping(products);

        //注入优惠方案
//        String discount = "second";
//        cart.setDiscount(disCounts.get(discount));
        cart.submitOrder();
    }
}
模板结构

适用场景

定义好主业务流程后,子模块暂时不知道具体的实现

总结

利用Java多态的特性来实现,并且也体现了开闭原则

相关文章

  • (十四)模板方法模式

    现在水果店不断扩展支付方式,但是不想影响主流程 模板方法模式 对于未知的方法,在主流程中,使用抽象方法代替,具体实...

  • 11.8设计模式-模板模式-详解

    设计模式-模式模式 模板方法模式详解 模板方法模式在android中的实际运用 1.模板方法模式详解 2.模板方法...

  • 第5章 -行为型模式-模板方法模式

    一、模板方法模式的简介 二、模板方法模式的优点 三、模板方法模式的应用场景 四、模板方法模式的实例

  • 模板方法模式

    模板方法模式 模板方法模式的定义 模板方法模式(Template Method Pattern)是如此简单,以致让...

  • 设计模式系列-模板方法模式

    JAVA设计模式系列: 单例模式 观察者模式 模板方法模式 模板方法模式 定义 模板方法模式在一个方法中定义了算法...

  • 设计模式(十四)-- 模板方法模式

    源代码GitHub源代码 1.本文目标 本文目标是为了让大家认识并理解模板方法模式 2.基本套路 定义:定义了一个...

  • 模板方法模式

    一、模板方法模式介绍 二、模板方法模式代码实例

  • 模板方法模式

    一、概念 二、模板方法模式UML图 三、模板方法模式的2个角色 四、模板方法与基本方法的概念 模板方法: 基本方法...

  • 设计模式 | 模板方法模式及典型应用

    本文的主要内容: 介绍模板方法模式 源码分析模板方法模式的典型应用Servlet 中的模板方法模式Mybatis ...

  • 模板方法及观察者模式

    1、本文主要内容 模板方法定义 模板方法示例 观察者模式 本文主要讲两个设计模式,模板方法以及观察者模式,模板方法...

网友评论

      本文标题:(十四)模板方法模式

      本文链接:https://www.haomeiwen.com/subject/nhjrjctx.html