Java 性能调优实战
刘超
前金山软件技术经理
59174 人已学习
新⼈⾸单¥59
登录后,你可以任选4讲全文学习
课程目录
已完结/共 49 讲
开篇词 (1讲)
模块一 · 概述 (2讲)
结束语 (1讲)
Java 性能调优实战
15
15
1.0x
00:00/00:00
登录|注册

31 | 装饰器模式:如何优化电商系统中复杂的商品价格策略?

protmotion(supportPromotions, baseCount)
getPayMoney(orderDetail)
countCouponPayMoney(orderDetail)
countPayMoney(orderDetail)
countCouponPayMoney(orderDetail)
countPayMoney(orderDetail)
countPayMoney(orderDetail)
count
countPayMoney(orderDetail)
PromotionFactory
RedPacketDecorator
CouponDecorator
BaseCountDecorator
BaseCount
装饰器模式
策略模式
责任链模式
使业务逻辑清晰易读易懂
优化业务代码结构设计
简化业务代码
优化业务复杂度
计算促销后的支付价格
红包计算类
优惠券计算类
计算支付金额的抽象类
计算支付金额接口类
思考题
总结
优化电商系统中的商品价格策略
装饰器模式

该思维导图由 AI 生成,仅供参考

你好,我是刘超。
开始今天的学习之前,我想先请你思考一个问题。假设现在有这样一个需求,让你设计一个装修功能,用户可以动态选择不同的装修功能来装饰自己的房子。例如,水电装修、天花板以及粉刷墙等属于基本功能,而设计窗帘装饰窗户、设计吊顶装饰房顶等未必是所有用户都需要的,这些功能则需要实现动态添加。还有就是一旦有新的装修功能,我们也可以实现动态添加。如果要你来负责,你会怎么设计呢?
此时你可能会想了,通常给一个对象添加功能,要么直接修改代码,在对象中添加相应的功能,要么派生对应的子类来扩展。然而,前者每次都需要修改对象的代码,这显然不是理想的面向对象设计,即便后者是通过派生对应的子类来扩展,也很难满足复杂的随意组合功能需求。
面对这种情况,使用装饰器模式应该再合适不过了。它的优势我想你多少知道一点,我在这里总结一下。
装饰器模式能够实现为对象动态添加装修功能,它是从一个对象的外部来给对象添加功能,所以有非常灵活的扩展性,我们可以在对原来的代码毫无修改的前提下,为对象添加新功能。除此之外,装饰器模式还能够实现对象的动态组合,借此我们可以很灵活地给动态组合的对象,匹配所需要的功能。
下面我们就通过实践,具体看看该模式的优势。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

装饰器模式是一种优化电商系统中复杂商品价格策略的技术,通过动态添加装修功能实现灵活扩展。该模式包括接口、具体对象、装饰类和具体装饰类,通过装饰器模式可以实现对象的动态组合和功能扩展。通过一个装修功能的案例,演示了如何使用装饰器模式实现灵活的装修功能扩展,代码结构简洁清晰,业务逻辑易读。进一步,文章提到了如何通过装饰器模式优化电商系统中的商品价格策略,实现不同促销活动的灵活组合。通过实践,读者可以更好地理解装饰器模式的优势和应用场景。 文章通过一个电商系统中商品价格策略的优化案例,详细介绍了装饰器模式的应用。首先,建立了订单、商品和促销类型等相关类,然后通过接口和抽象类实现了计算支付金额的功能。接着,通过具体的装饰类实现了优惠券和红包的计算功能,并通过工厂类组合商品的促销类型。最后,通过运行结果展示了装饰器模式的灵活性和优势。 总的来说,装饰器模式的应用使得业务代码结构清晰,易读易懂,同时实现了各个促销类型的计算功能相互独立,通过工厂类自由组合各种促销类型。这种设计模式不仅简化了业务代码,还优化了业务代码的结构设计,使得整个业务逻辑清晰易懂。文章还提到了责任链模式、策略模式与装饰器模式的相似之处,为读者提供了更多思考和探讨的空间。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《Java 性能调优实战》
新⼈⾸单¥59
立即购买
登录 后留言

全部留言(31)

  • 最新
  • 精选
  • 密码123456
    责任链。最常见到的就是接收http请求了。帮我们转码,转化成实体类,等等。策略模式。最常简单和用到的就是集合排序,自定义排序规则。装饰器,最常见到的就是各种流,比如字符流,字节流等

    作者回复: 👍🏻

    2019-08-01
    2
    49
  • nightmare
    netty中的pipeline,tomcat中的filter,属于责任链, springmvc中对参数解析的就是 策略模式,每一个参数类型一个实现类,用for循环解析参数 java. io就是经典的装饰器模式

    作者回复: 有读源码习惯👍🏻

    2019-08-01
    22
  • 尔冬橙
    老师,为什么java io是装饰器模式

    作者回复: 我们知道,InputStream是直接读写文件的,除了InputStream,在其上层还有BufferedInputStream、DataInputStream等其他修饰类,增加了缓存读取、类型读取等功能,相当于InputStream之上加了很多修饰功能,在所以它是一个装饰器模式。

    2019-09-01
    6
  • neohope
    老师您好,想请教一下,在实际做优惠活动时,很多活动策略之间是相互排斥的,用了优惠1就不能用优惠2,用了优惠2就不能用红包。这种自动选择最优优惠策略,在哪里实现比较合理呢?多谢!

    作者回复: 也可以基于该模式实现,我们只需要将叠加逻辑改成选择最优逻辑即可。

    2019-11-24
    3
  • 冯传博
    希望能有个类图,这样就能一目了然的看清楚各个类之间的关系了

    作者回复: 好的,后续补上

    2019-08-01
    4
    3
  • Liam
    请问老师,装饰器和代理有什么区别呢,代理也可以实现被代理的接口,并注入被代理对象实现功能扩展,最后可以委托被代理对象完成基础功能

    作者回复: 两者都可以达到对一个对象添加方法,但代理模式偏向于控制外部其他对象对该对象的访问,而装饰器是为了增强一个对象的功能。

    2019-08-06
    2
  • -W.LI-
    public BigDecimal countPayMoney(OrderDetail orderDetail) { BigDecimal payTotalMoney = new BigDecimal(0); payTotalMoney = super.countPayMoney(orderDetail); payTotalMoney = countCouponPayMoney(orderDetail); return payTotalMoney; } 老师好!这里为啥要调用父类的countPayMoney()方法啊? 责任链模式:感觉责任连模式比较固定不怎么会变一层往一层调用,解耦,某一层变了不影响别的层。 策略模式:策略模式,虽然也是封装了很多不同的策略,但是使用时一般一次只选一个实现类使用,不会有嵌套。 装饰者模式:责任链有的优点他都有,装饰者还能动态组合。 谢谢老师,希望给出详细答案谢谢

    作者回复: 由于我们这里考虑到灵活的组合模式,所以需要调用父类的countPayMoney()方法。

    2019-08-01
    2
  • 奋斗的小白鼠
    老师,问一个小白问题,产品Map<PromotionType, SupportPromotions> supportPromotions; //支持促销类型 怎么存入数据库了?

    作者回复: 简单的将SupportPromotions促销类型存储起来就好了

    2019-12-04
    1
  • Gred
    老师,您在SupportPromotions重写 clone 方法,只对类进行拷贝,但是成员变量只是浅拷贝,如果要实际应用业务场景,是不是应该改用深拷贝,避免其他订单的优化券等信息影响到了。

    作者回复: 是的

    2019-08-13
    1
  • 感觉老师在红包这个例子里面,其实最重要的解耦是装饰器实现的各种基本的优惠打折手段与工厂的各种优惠规则比如红包抵用券可叠加等等。

    作者回复: 对的,主要用来优化业务的复杂度。

    2019-08-02
    1
收起评论
显示
设置
留言
31
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部