(十四)模板方法模式

2019-08-10  本文已影响0人  feiry

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


扩展支付方式

模板方法模式

模板示意图

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

/**
 * 模板方法模式
 * 购物车费用结算过程
 */
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多态的特性来实现,并且也体现了开闭原则

上一篇 下一篇

猜你喜欢

热点阅读