美文网首页
第2章-商场促销--策略模式

第2章-商场促销--策略模式

作者: Programmer_BiBi | 来源:发表于2021-08-11 23:58 被阅读0次

需求描述

商场收银软件客户端,具备打折、满减等促销活动

共性代码

父类

public abstract class CashSuper {
    //收取一定的钱,然后根据某种优惠规则返回最终的收费
    public abstract double acceptCash(double money);
}

正常收费

public class CashNormal extends CashSuper {

    //没任何优惠,给多少收多少
    @Override
    public double acceptCash(double money) {
        return money;
    }
}

满减收费

public class CashReturn extends CashSuper {
    private final double moneyCondition;
    private final double moneyReturn;

    public CashReturn(double moneyCondition, double moneyReturn) {
        this.moneyCondition = moneyCondition;
        this.moneyReturn = moneyReturn;
    }

    @Override
    public double acceptCash(double money) {
        double result = money;
        if (money > moneyCondition) {
            result = money - (money / moneyCondition) * moneyReturn;
        }
        return result;
    }
}

打折

public class CashRebate extends CashSuper {
    private final double moneyRebate;

    public CashRebate(double moneyRebate) {
        this.moneyRebate = moneyRebate;
    }

    @Override
    public double acceptCash(double money) {
        return money * moneyRebate;
    }
}

简单工厂模式

属于创建型模式,为类创建型模式,为了根据某些参数条件动态创建对象

工厂类

public class CashFactory {
    public static CashSuper createCashAccept(String type) {
        CashSuper cashSuper = null;
        switch (type) {
            case "正常收费":
                cashSuper = new CashNormal();
                break;
            case "满300减100":
                cashSuper = new CashReturn(300.0, 100.0);
                break;
            case "打八折":
                cashSuper = new CashRebate(0.8);
                break;
            default:
                System.out.println("not support");
                break;
        }
        return cashSuper;
    }
}

客户端

public class CashMain {

    public static void main(String[] args) {
        //简单工厂模式
        double total = 0;
        CashSuper cashSuper = CashFactory.createCashAccept("打八折");
        double price = 2.0;
        int num = 5;
        double money = cashSuper.acceptCash(price * num);
        System.out.println("单价:" + price + " 数量:" + num + " 合计:" + money);
        total += money;
        System.out.println("总价:" + total);
    }
}

缺点

  1. 超市促销活动往往很频繁且有时效性,也就是说收银软件如果使用以上简单工厂模式,那么工厂类就要频繁的进行改动、编译、上线、下线

策略模式

属于行为型模式,是算法的抽象,运行时动态改变类的行为或算法。如果系统中多个类使用环境相同,仅仅区别于具体类的行为,而系统需要在这些行为中动态的选择一种。
策略模式有助于减少if...else...分支。

环境类

public class CashContext {
    //环境类持有具体策略类的一个对象引用
    private final CashSuper cashSuper;

    public CashContext(CashSuper cashSuper) {
        this.cashSuper = cashSuper;
    }

    public double getResult(double money) {
        return cashSuper.acceptCash(money);
    }
}

客户端

public class CashMain {

    public static void main(String[] args) {
        //策略模式
        double total = 0;
        CashContext cashContext = new CashContext(new CashRebate(0.8));
        double price = 2.0;
        int num = 5;
        double money = cashContext.getResult(price * num);
        System.out.println("单价:" + price + " 数量:" + num + " 合计:" + money);
        total += money;
        System.out.println("总价:" + total);
    }
}

特性

  1. 环境类持有具体策略类的对象引用,根据不同的条件实例化具体策略对象,并由环境类持有引用,由此实现不同算法行为的动态切换
  2. 抽象策略类以及具体策略的继承关系,可实现一些共性算法的继承
  3. 具体策略类较多的情况下,可改进为混合模式(简单工厂+策略模式)

简单工厂+策略模式

环境类

public class CashFactoryContext {
    private CashSuper cashSuper;

    public CashFactoryContext(String type) {
        switch (type) {
            case "正常收费":
                cashSuper = new CashNormal();
                break;
            case "满300减100":
                cashSuper = new CashReturn(300.0, 100.0);
                break;
            case "打八折":
                cashSuper = new CashRebate(0.8);
                break;
            default:
                System.out.println("not support");
                break;
        }
    }

    public double getResult(double money) {
        return cashSuper.acceptCash(money);
    }
}

客户端

public class CashMain {

    public static void main(String[] args) {
        //简单工厂+策略模式
        double total = 0;
        CashFactoryContext cashFactoryContext = new CashFactoryContext("打八折");
        double price = 2.0;
        int num = 5;
        double money = cashFactoryContext.getResult(price * num);
        System.out.println("单价:" + price + " 数量:" + num + " 合计:" + money);
        total += money;
        System.out.println("总价:" + total);
    }
}

简单工厂和策略模式区别

  1. 简单工厂为创建型模式,强调对象的动态创建;策略模式为行为型模式,强调算法的封装和动态选择替换,算法行为委派给不同的对象
  2. 两者可一定程度上实现相同的功能,如上各个具体策略类,但如果新增行为策略,对于简单工厂来说,就得修改工厂类,可能会导致错误比较繁琐。
    但对于策略模式来说,仅仅增加一个具体策略类,作为参数传递给环境类而已,但缺点是,客户端必须清楚了解每个具体策略类,而不像工厂模式一样,只需要知道不同场景下的参数type即可。
  3. 简单工厂+策略模式,具备更好的解耦性,客户端只需要知道CashFactoryContext一个类即可,具体的行为算法对象的创建逻辑也隐藏了,但同时策略增加时也不可避免的需要修改CashFactoryContext。
  4. 综上所述,各有利弊,择优选择。

github

相关文章

  • 商场促销-策略模式

    策略模式概念:它定义了算法家族,分别封装起来,让他们之前可以互相替换,此模式让算法的变化,不会影响到使用算法的客户...

  • 大话设计模式读书笔记-2策略模式

    第2章 商场促销——策略模式 概念 策略模式定义算法家族,分别封装后,让它们可相互替换,此模式可以让使用算法的用户...

  • Design Patterns Talk - Strategy

    《大话设计模式》第 2 章 - 策略模式 的 Swift 实现。 问题 做一个商场收银软件,根据不同促销方案返回不...

  • 第2章 商场促销--策略模式

    商场收银软件 简单来说,就是根据单价数量计算出总价,同时要应对商场的各种促销活动。例如,打九折,满300减100,...

  • 第2章-商场促销--策略模式

    背景: 商场收银软件,单价、数量、各种折扣活动,向客户收费 小菜: v1.0:输入单价和数量,算出金额并累加到总额...

  • 第2章-商场促销--策略模式

    需求描述 商场收银软件客户端,具备打折、满减等促销活动 共性代码 父类 正常收费 满减收费 打折 简单工厂模式 属...

  • 【设计模式】策略模式之商场促销

    要求 实现一个商场收银软件,营业员根据客户购买的商品单价和数量,向客户收费。 思路 Iter1 初始草稿 每个商...

  • 大话设计模式笔记 - 策略模式

    大话设计模式笔记 - 策略模式 本文的案例是一个商场促销的案例。 我们去商场购物时,结算系统是必不可少的一个环节。...

  • 策略模式和工厂模式在促销系统下的应用

    策略模式和工厂模式在促销系统下的应用 标签: 设计模式 策略模式 工厂模式 促销系统 php 设计模式为我们提供了...

  • 第二章 商场促销 - 策略模式

    实现一个商场的收银程序,根据商品单价、数量,计算总价,生成小票。 关于计价算法,属于经常会变化的部分,比如今天打八...

网友评论

      本文标题:第2章-商场促销--策略模式

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