大话设计模式笔记(二)——商品促销 策略模式

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。

本文链接:https://blog.csdn.net/luo4105/article/details/76542977

第二章商品促销——策略模式

需求:商品价格计算,并增加折扣条件

工厂模式UML图

在工厂模式中,调用端代码会通过折扣工厂类生成折扣对象,折扣对象调用折扣方法。这里关联了两个类,工厂类和抽象折扣类。

策略模式UML图

在策略模式中,会在策略环境类的构造器中完成折扣类的初始话,并在策略环境的实现方法调用折扣类的折扣算法。这样调用类只会关联策略环境类。

简单工厂模式需要的是生成的对象,所以在客户端代码中会存在工厂类和生成类,而策略模式关注的是相应算法,它并不关注算法类对象,所以在客户端代码中只会存在context环境类。这样降低代码耦合度。

代码

Context

public class SaleContext {

    private SaleStrategy saleStrategy = null;

    public SaleContext(String saleSelector) {
        switch (saleSelector) {
            case "打9折":
                this.saleStrategy = new PercentSaleStrategy(0.9);
                break;
            case "打8折":
                this.saleStrategy = new PercentSaleStrategy(0.8);
                break;
            case "满300减100":
                this.saleStrategy = new FullSendSaleStrategy(300, 100);
                break;
            default:
                this.saleStrategy = new NormalStrategy();
                break;
        }
    }

    public double contextInterface(double money) {
        return saleStrategy.getSaleMoney(money);
    }

}

SaleStrategy

abstract class SaleStrategy {
    public abstract double getSaleMoney(double money);
}

PercentSaleStrategy(折扣促销)

class PercentSaleStrategy extends SaleStrategy {

    private double pecent = 0.0d;

    public PercentSaleStrategy(double pecent) {
        this.pecent = pecent;
    }

    @Override
    public double getSaleMoney(double money) {
        return money * pecent;
    }
}

FullSendSaleStrategy(满减促销)

class FullSendSaleStrategy extends SaleStrategy {

    private double fullMoney = 0.0d;
    private double sendMonty = 0.0d;

    public FullSendSaleStrategy(double fullMoney, double sendMonty) {
        this.fullMoney = fullMoney;
        this.sendMonty = sendMonty;
    }

    @Override
    public double getSaleMoney(double money) {
        return money > fullMoney ? (money - sendMonty) : money;
    }
}

总结

策略模式是定义了一系列算法,这些算法从层次上实现相同的功能,最好析取出算法层,可以减少算法之间和调用算法的耦合。

在实际工作中,当听到需求中包含在不同时间应用不同业务规则,就可以考虑使用策略模式。

设计模式的核心思想就是对接口编程,封装变化。

应用场景

只要在分析过程中听到需要在不同时间应用不同的业务规则,就可以考虑使用策略模式。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏Java技术栈

设计模式都没用过,好意思出去面试?

因为我们的项目的需求是永远在变的,为了应对这种变化,使得我们的代码能够轻易的实现解耦和拓展。如果能够保证代码一次写好以后都不会再改变了,那可以想怎么写怎么写了。

15320
来自专栏SDNLAB

揭秘AWS,Azure和Google:云提供商之间的差异真的重要吗?

众所周知,目前的云计算市场中,亚马逊AWS、微软Azure和谷歌云平台是最大的“玩家”,他们各自都有自己的术语、定价、服务目录和购买版本,因此用户在评估该选择哪...

14020
来自专栏CDA数据分析师

网红AI教师Siraj Raval彻底栽了!剽窃论文遭Jeff Dean等大牛抵制

网红AI研究员、号称拥有 100 万学生的 Siraj Raval,这次彻底栽了。

12520
来自专栏用户6477171的专栏

火绒安全警报:新型宏病毒通过Excel传播 访问2345网站暗刷流量

【快讯】火绒安全团队发出警告,近日,一批新型宏病毒正通过Excel文件传播,该病毒入侵电脑运行后,会悄悄访问带有推广计费名的2345网址暗刷流量,并且还会感染电...

7030
来自专栏用户6477171的专栏

软件推荐之­——压缩软件特辑

有不少朋友问我们,能不能推荐个压缩软件?也有很多网友纷纷推荐了自己使用的压缩软件,所以我们就整理了一下大家提出的软件列表。

13030
来自专栏搜云库技术团队

小型系统如何“微服务”开发

提到“微服务”,我相信网上各种“微服务”的演变案例都会给人一种“因大而分”的前提错觉,这可能会导致许多的“小白”产生没有机会接触“大项目”而对“微服务”可望而不...

9030
来自专栏机器学习算法与Python学习

网红AI教师Siraj Raval彻底栽了!剽窃论文遭Jeff Dean等大牛抵制

网红AI研究员、号称拥有 100 万学生的 Siraj Raval,这次彻底栽了。

8310
来自专栏萌海无涯

黑雷苹果模拟器 v1.1.2桌面版

黑雷苹果桌面版是一款由我国自主研发的首款苹果手机模拟器,软件功能非常简单,通过这款软件玩家可以在电脑上运行苹果手机中的软件和游戏,是国内首款PC电脑iPhone...

10010
来自专栏用户6477171的专栏

“净广大师”病毒HTTPS劫持技术深度分析

近期,火绒团队截获一个由商业软件携带的病毒,并以其载体命名为“净广大师”病毒。在目前广为流行的“流量劫持”类病毒中,该病毒策略高明、技术暴力,并攻破HTTPS的...

11440
来自专栏故久

itext将html转pdf

14730

扫码关注云+社区

领取腾讯云代金券

年度创作总结 领取年终奖励