装饰器模式(Decorator Pattern):电商平台商品价格策略实战案例分析

image.png

在电商平台中,商品价格可能会受到各种因素的影响,如会员折扣、优惠券、限时促销等。这些价格策略需要动态地应用到商品上,同时保持价格计算的灵活性和可扩展性。

肖哥弹架构 跟大家“弹弹” 设计模式,需要代码关注

欢迎 点赞,点赞,点赞。

关注公号Solomon肖哥弹架构获取更多精彩内容

2. 为什么要使用装饰器设计模式

装饰器模式允许我们动态地给商品添加多种价格策略,而不需要修改商品本身的代码。这样可以在运行时根据需要透明地添加或修改价格策略。

3. 标准装饰器设计模式图

image.png

4. 业务装饰器设计模式图

image.png

5. 业务代码参考


    // 商品价格组件接口
    interface ProductPrice {
        double apply();
    }

    // 简单商品价格实现
    class SimpleProductPrice implements ProductPrice {
        private double basePrice;

        public SimpleProductPrice(double basePrice) {
            this.basePrice = basePrice;
        }

        public double getBasePrice() {
            return basePrice;
        }

        @Override
        public double apply() {
            // 应用基础价格,实际项目中可能包含更多逻辑
            return basePrice;
        }
    }

    // 装饰器抽象类
    abstract class PriceDecorator implements ProductPrice {
        protected ProductPrice decoratedPrice;

        public PriceDecorator(ProductPrice decoratedPrice) {
            this.decoratedPrice = decoratedPrice;
        }

        @Override
        public double apply() {
            // 调用被装饰的组件的价格应用方法
            return decoratedPrice.apply();
        }
    }

    // 会员折扣装饰器
    class DiscountDecorator extends PriceDecorator {
        private double discount;

        public DiscountDecorator(ProductPrice productPrice, double discount) {
            super(productPrice);
            this.discount = discount;
        }

        @Override
        public double apply() {
            // 应用折扣
            return super.apply() * (1 - discount);
        }
    }

    // 优惠券装饰器
    class CouponDecorator extends PriceDecorator {
        private double couponValue;

        public CouponDecorator(ProductPrice productPrice, double couponValue) {
            super(productPrice);
            this.couponValue = couponValue;
        }

        @Override
        public double apply() {
            // 应用优惠券
            return super.apply() - couponValue;
        }
    }

    // 促销活动装饰器
    class PromotionDecorator extends PriceDecorator {
        private double promotionDiscount;

        public PromotionDecorator(ProductPrice productPrice, double promotionDiscount) {
            super(productPrice);
            this.promotionDiscount = promotionDiscount;
        }

        @Override
        public double apply() {
            // 应用促销折扣
            return super.apply() * (1 - promotionDiscount);
        }
    }

    // 客户端使用装饰器模式计算商品价格
    class ECommercePriceCalculator {
        public static void main(String[] args) {
            ProductPrice basePrice = new SimpleProductPrice(100.0);
            System.out.println("Original Price: " + basePrice.apply());

            ProductPrice withDiscount = new DiscountDecorator(basePrice, 0.1); // 10% 会员折扣
            System.out.println("Price with Discount: " + withDiscount.apply());

            ProductPrice withCoupon = new CouponDecorator(withDiscount, 5.0); // 减5元优惠券
            System.out.println("Price with Coupon: " + withCoupon.apply());

            ProductPrice withPromotion = new PromotionDecorator(withCoupon, 0.05); // 5% 促销活动
            System.out.println("Price with Promotion: " + withPromotion.apply());
        }
    }

6. 使用装饰器设计模式的好处

装饰器模式解决了以下问题并带来了以下好处:

  • 动态添加职责:可以在运行时根据需要动态地添加额外的价格策略。
  • 保持对象的透明性:装饰后的对象与原始对象对客户端来说看起来是一致的。
  • 扩展性:新增价格策略时无需修改现有代码,符合开闭原则。

7. 其他使用单例场景参考

装饰器模式适用于需要动态扩展对象行为的场景,例如:

  • 权限校验:动态为用户添加不同的权限校验。
  • 日志记录:为方法调用添加日志记录功能。

8. 可以参考的开源框架

  • Spring Framework:在Spring AOP中,装饰器模式被用来实现方法的前置、后置处理。

总结

装饰器模式是一种强大的设计模式,它允许我们在不修改对象本身的情况下,动态地扩展对象的功能。这使得代码更加灵活和可扩展。

历史热点文章

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 219,539评论 6 508
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,594评论 3 396
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 165,871评论 0 356
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,963评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,984评论 6 393
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,763评论 1 307
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,468评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,357评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,850评论 1 317
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,002评论 3 338
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,144评论 1 351
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,823评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,483评论 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,026评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,150评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,415评论 3 373
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,092评论 2 355

推荐阅读更多精彩内容