靈活商品定價策略的最佳實踐)
目錄一、裝飾器模式的概念及怎么用一基本概念和功能二結(jié)構(gòu)圖分析三舉例分析二、裝飾器模式的基本用法一接口定義去定義具體需要實現(xiàn)的相關(guān)方法二具體對象針對需要實現(xiàn)的方法做初始化操作即基本的實現(xiàn)三裝飾類抽象類初始化具體對象四其他具體裝飾類實現(xiàn)自己特性的需求五實際使用三、具體案例分析目標(biāo)用裝飾器模式動手實現(xiàn)一套商品價格策略的優(yōu)化方案。1.先建立訂單和商品的屬性類:主訂單詳細(xì)訂單商品促銷類型優(yōu)惠券紅包2.建立計算支付金額的接口類以及基本類3.建立計算支付金額的抽象類調(diào)用基本類4.優(yōu)惠券計算類通過繼承抽象類來實現(xiàn)所需要的修飾類5.紅包計算類通過繼承抽象類來實現(xiàn)所需要的修飾類6.通過一個工廠類來組合商品的促銷類型7.實際使用操作四、總結(jié)參考書籍、文獻(xiàn)和資料干貨分享感謝您的閱讀在現(xiàn)代軟件開發(fā)中設(shè)計模式為我們提供了解決復(fù)雜問題的通用框架裝飾器模式作為其中的經(jīng)典之一因其靈活性和擴(kuò)展性而被廣泛應(yīng)用。然而裝飾器模式不僅僅局限于代碼結(jié)構(gòu)的優(yōu)化它還能在實際業(yè)務(wù)中發(fā)揮巨大的作用。本文將帶您深入了解裝飾器模式的核心概念與應(yīng)用方法特別是如何利用這一模式在商品定價策略中實現(xiàn)靈活的優(yōu)化與調(diào)整。通過一個實際案例我們將探索如何借助裝飾器模式在面對多變的市場需求時快速應(yīng)對并優(yōu)化商品的定價策略。這不僅是對設(shè)計模式的一個學(xué)習(xí)更是一次關(guān)于如何在實際業(yè)務(wù)場景中解決問題的深刻體驗。無論您是軟件開發(fā)人員還是產(chǎn)品經(jīng)理這篇文章都能為您提供具有實際指導(dǎo)意義的思路和方法助力您在工作中更加高效地應(yīng)對各種挑戰(zhàn)。一、裝飾器模式的概念及怎么用一基本概念和功能裝飾器模式能夠?qū)崿F(xiàn)從一個對象的外部來給對象添加功能有非常靈活的擴(kuò)展性可以在對原來的代碼毫無修改的前提下為對象添加新功能。除此之外裝飾器模式還能夠?qū)崿F(xiàn)對象的動態(tài)組合借此我們可以很靈活地給動態(tài)組合的對象匹配所需要的功能。二結(jié)構(gòu)圖分析Component為統(tǒng)一接口也是裝飾類和被裝飾類的基本類型。ConcreteComponent為具體實現(xiàn)類也是被裝飾類他本身是個具有一些功能的完整的類。Decorator是裝飾類實現(xiàn)了Component接口的同時還在內(nèi)部維護(hù)了一個ConcreteComponent的實例并可以通過構(gòu)造函數(shù)初始化。而Decorator本身通常采用默認(rèn)實現(xiàn)他的存在僅僅是一個聲明我要生產(chǎn)出一些用于裝飾的子類了。而其子類才是賦有具體裝飾效果的裝飾產(chǎn)品類。ConcreteDecorator是具體的裝飾產(chǎn)品類每一種裝飾產(chǎn)品都具有特定的裝飾效果??梢酝ㄟ^構(gòu)造器聲明裝飾哪種類型的ConcreteComponent從而對其進(jìn)行裝飾。三舉例分析假設(shè)現(xiàn)在有這樣一個需求讓你設(shè)計一個裝修功能用戶可以動態(tài)選擇不同的裝修功能來裝飾自己的房子。例如水電裝修、天花板以及粉刷墻等屬于基本功能而設(shè)計窗簾裝飾窗戶、設(shè)計吊頂裝飾房頂?shù)任幢厥撬杏脩舳夹枰倪@些功能則需要實現(xiàn)動態(tài)添加。還有就是一旦有新的裝修功能我們也可以實現(xiàn)動態(tài)添加。采用裝飾器模式可以很好的解決以上問題。二、裝飾器模式的基本用法基于裝飾器模式實現(xiàn)的裝修功能的代碼結(jié)構(gòu)簡潔易讀業(yè)務(wù)邏輯也非常清晰并且如果我們需要擴(kuò)展新的裝修功能只需要新增一個繼承了抽象裝飾類的子類即可。裝飾器模式包括了以下幾個角色接口、具體對象、裝飾類、具體裝飾類。接口定義了具體對象的一些實現(xiàn)方法具體對象定義了一些初始化操作比如開頭設(shè)計裝修功能的案例中水電裝修、天花板以及粉刷墻等都是初始化操作裝飾類則是一個抽象類主要用來初始化具體對象的一個類其它的具體裝飾類都繼承了該抽象類。一接口定義去定義具體需要實現(xiàn)的相關(guān)方法/** * 描述定義一個基本裝修接口 * * author yanfengzhang * date 2020-04-19 13:32 */ public interface IDecorator { /** * 裝修方法 */ void decorate(); }二具體對象針對需要實現(xiàn)的方法做初始化操作即基本的實現(xiàn)/** * 描述裝修基本類 * * author yanfengzhang * date 2020-04-19 13:32 */ public class Decorator implements IDecorator { /** * 基本實現(xiàn)方法 */ Override public void decorate() { System.out.println(水電裝修、天花板以及粉刷墻.); } }三裝飾類抽象類初始化具體對象/** * 描述基本裝飾類 * * author yanfengzhang * date 2020-04-19 13:34 */ public abstract class BaseDecorator implements IDecorator { private IDecorator decorator; public BaseDecorator(IDecorator decorator) { this.decorator decorator; } /** * 調(diào)用裝飾方法 */ Override public void decorate() { if (decorator ! null) { decorator.decorate(); } } }四其他具體裝飾類實現(xiàn)自己特性的需求如果我們想要在基礎(chǔ)類上添加新的裝修功能只需要基于抽象類 BaseDecorator 去實現(xiàn)繼承類通過構(gòu)造函數(shù)調(diào)用父類以及重寫裝修方法實現(xiàn)裝修窗簾的功能即可。/** * 描述窗簾裝飾類 * * author yanfengzhang * date 2020-04-19 13:35 */ public class CurtainDecorator extends BaseDecorator { public CurtainDecorator(IDecorator decorator) { super(decorator); } /** * 窗簾具體裝飾方法 */ Override public void decorate() { System.out.println(窗簾裝飾。。。); super.decorate(); } }五實際使用/** * 描述具體使用測試 * * author yanfengzhang * date 2020-04-19 13:36 */ public class Test { public static void main(String[] args) { IDecorator decorator new Decorator(); IDecorator curtainDecorator new CurtainDecorator(decorator); curtainDecorator.decorate(); } }三、具體案例分析每逢雙十一為了加大商城的優(yōu)惠力度開發(fā)往往要設(shè)計紅包 限時折扣或紅包 抵扣券等組合來實現(xiàn)多重優(yōu)惠。而在平時由于某些特殊原因商家還會贈送特殊抵扣券給購買用戶而特殊抵扣券 各種優(yōu)惠又是另一種組合方式。要實現(xiàn)以上這類組合優(yōu)惠的功能剛剛介紹的裝飾器模式就很適合用在這里其相互獨立、自由組合以及方便動態(tài)擴(kuò)展功能的特性可以很好地解決這類需求。目標(biāo)用裝飾器模式動手實現(xiàn)一套商品價格策略的優(yōu)化方案。1.先建立訂單和商品的屬性類:主訂單詳細(xì)訂單商品促銷類型優(yōu)惠券紅包訂單和商品的屬性類只建立了幾個關(guān)鍵字段主訂單包含若干詳細(xì)訂單詳細(xì)訂單中記錄了商品信息商品信息中包含了促銷類型信息一個商品可以包含多個促銷類型只討論單個促銷和組合促銷主訂單import java.math.BigDecimal; import java.util.List; /** * 描述主訂單 * * author yanfengzhang * date 2020-04-19 14:01 */ Data public class Order { /** * 訂單ID */ private int id; /** * 訂單號 */ private String orderNo; /** * 總支付金額 */ private BigDecimal totalPayMoney; /** * 詳細(xì)訂單列表 */ private ListOrderDetail list; }詳細(xì)訂單import java.math.BigDecimal; /** * 描述詳細(xì)訂單 * * author yanfengzhang * date 2020-04-19 14:06 */ Data public class OrderDetail { /** * 詳細(xì)訂單ID */ private int id; /** * 主訂單ID */ private int orderId; /** * 商品詳情 */ private Merchandise merchandise; /** * 支付單價 */ private BigDecimal payMoney; }具體商品import java.math.BigDecimal; import java.util.Map; /** * 描述具體商品 * * author yanfengzhang * date 2020-04-19 14:09 */ Data public class Merchandise { /** * 商品SKU */ private String sku; /** * 商品名稱 */ private String name; /** * 商品單價 */ private BigDecimal price; /** * 支持促銷類型 */ private MapPromotionType, SupportPromotions supportPromotions; }促銷類型/** * 描述促銷類型 * * author yanfengzhang * date 2020-04-19 14:16 */ public enum PromotionType { /** * 優(yōu)惠卷 */ COUPON, /** * 紅包 */ REDPACKED; }優(yōu)惠券import java.math.BigDecimal; /** * 描述優(yōu)惠券 * * author yanfengzhang * date 2020-04-19 14:13 */ Data public class UserCoupon { /** * 優(yōu)惠券ID */ private int id; /** * 領(lǐng)取優(yōu)惠券用戶ID */ private int userId; /** * 商品SKU */ private String sku; /** * 優(yōu)惠金額 */ private BigDecimal coupon; }紅包import java.math.BigDecimal; /** * 描述紅包 * * author yanfengzhang * date 2020-04-19 14:14 */ Data public class UserRedPacket { /** * 紅包ID */ private int id; /** * 領(lǐng)取用戶ID */ private int userId; /** * 商品SKU */ private String sku; /** * 領(lǐng)取紅包金額 */ private BigDecimal redPacket; }促銷類型/** * 描述促銷類型 * * author yanfengzhang * date 2020-04-19 14:16 */ Data public class SupportPromotions implements Cloneable { /** * 該商品促銷的ID */ private int id; /** * 促銷類型 1\優(yōu)惠券 2\紅包 */ private PromotionType promotionType; /** * 優(yōu)先級 */ private int priority; /** * 用戶領(lǐng)取該商品的優(yōu)惠券 */ private UserCoupon userCoupon; /** * 用戶領(lǐng)取該商品的紅包 */ private UserRedPacket userRedPacket; /** * 重寫clone方法 */ Override public SupportPromotions clone() { SupportPromotions supportPromotions null; try { supportPromotions (SupportPromotions) super.clone(); } catch (CloneNotSupportedException e) { e.printStackTrace(); } return supportPromotions; } }2.建立計算支付金額的接口類以及基本類基本接口定義/** * 描述計算支付金額接口類 * * author yanfengzhang * date 2020-04-19 14:09 */ public interface IBaseCount { /** * 功能描述計算支付金額 * author yanfengzhang * date 2020-04-19 14:40 * param orderDetail * return BigDecimal */ BigDecimal countPayMoney(OrderDetail orderDetail); }基本實現(xiàn)類/** * 描述支付基本類 * * author yanfengzhang * date 2020-04-19 14:41 */ public class BaseCount implements IBaseCount { Override public BigDecimal countPayMoney(OrderDetail orderDetail) { orderDetail.setPayMoney(orderDetail.getMerchandise().getPrice()); System.out.println(商品原單價金額為 orderDetail.getPayMoney()); return orderDetail.getPayMoney(); } }3.建立計算支付金額的抽象類調(diào)用基本類/** * 描述計算支付金額的抽象類 * * author yanfengzhang * date 2020-04-19 14:48 */ public abstract class BaseCountDecorator implements IBaseCount { private IBaseCount count; public BaseCountDecorator(IBaseCount count) { this.count count; } Override public BigDecimal countPayMoney(OrderDetail orderDetail) { BigDecimal payTotalMoney new BigDecimal(0); if (count ! null) { payTotalMoney count.countPayMoney(orderDetail); } return payTotalMoney; } }4.優(yōu)惠券計算類通過繼承抽象類來實現(xiàn)所需要的修飾類/** * 描述計算使用優(yōu)惠券后的金額 * * author yanfengzhang * date 2020-04-19 14:50 */ public class CouponDecorator extends BaseCountDecorator { public CouponDecorator(IBaseCount count) { super(count); } Override public BigDecimal countPayMoney(OrderDetail orderDetail) { BigDecimal payTotalMoney new BigDecimal(0); payTotalMoney super.countPayMoney(orderDetail); payTotalMoney countCouponPayMoney(orderDetail); return payTotalMoney; } private BigDecimal countCouponPayMoney(OrderDetail orderDetail) { BigDecimal coupon orderDetail.getMerchandise().getSupportPromotions().get(PromotionType.COUPON).getUserCoupon().getCoupon(); System.out.println(優(yōu)惠券金額 coupon); orderDetail.setPayMoney(orderDetail.getPayMoney().subtract(coupon)); return orderDetail.getPayMoney(); } }5.紅包計算類通過繼承抽象類來實現(xiàn)所需要的修飾類/** * 描述計算使用紅包后的金額 * * author yanfengzhang * date 2020-04-19 15:24 */ public class RedPacketDecorator extends BaseCountDecorator { public RedPacketDecorator(IBaseCount count) { super(count); } Override public BigDecimal countPayMoney(OrderDetail orderDetail) { BigDecimal payTotalMoney new BigDecimal(0); payTotalMoney super.countPayMoney(orderDetail); payTotalMoney countCouponPayMoney(orderDetail); return payTotalMoney; } private BigDecimal countCouponPayMoney(OrderDetail orderDetail) { BigDecimal redPacket orderDetail.getMerchandise().getSupportPromotions().get(PromotionType.REDPACKED).getUserRedPacket().getRedPacket(); System.out.println(紅包優(yōu)惠金額 redPacket); orderDetail.setPayMoney(orderDetail.getPayMoney().subtract(redPacket)); return orderDetail.getPayMoney(); } }6.通過一個工廠類來組合商品的促銷類型/** * 描述計算促銷后的支付價格 * * author yanfengzhang * date 2020-04-19 14:58 */ public class PromotionFactory { public static BigDecimal getPayMoney(OrderDetail orderDetail) { /**獲取給商品設(shè)定的促銷類型*/ MapPromotionType, SupportPromotions supportPromotionsList orderDetail.getMerchandise().getSupportPromotions(); /**初始化計算類*/ IBaseCount baseCount new BaseCount(); if (supportPromotionsList ! null supportPromotionsList.size() 0) { for (PromotionType promotionType : supportPromotionsList.keySet()) { /**遍歷設(shè)置的促銷類型通過裝飾器組合促銷類型*/ baseCount protmotion(supportPromotionsList.get(promotionType), baseCount); } } return baseCount.countPayMoney(orderDetail); } /** * 組合促銷類型 * param supportPromotions * param baseCount * return */ private static IBaseCount protmotion(SupportPromotions supportPromotions, IBaseCount baseCount) { if (supportPromotions.getPromotionType() PromotionType.COUPON) { baseCount new CouponDecorator(baseCount); } else if (supportPromotions.getPromotionType() PromotionType.REDPACKED) { baseCount new RedPacketDecorator(baseCount); } return baseCount; } }7.實際使用操作/** * 描述測試 * * author yanfengzhang * date 2020-04-19 15:35 */ public class Test { volatile int counter 0; private static Order init(Order order) { MapPromotionType, SupportPromotions supportPromotionslist new HashMapPromotionType, SupportPromotions(); SupportPromotions supportPromotions new SupportPromotions(); supportPromotions.setPromotionType(PromotionType.COUPON); supportPromotions.setPriority(1); UserCoupon userCoupon new UserCoupon(); userCoupon.setCoupon(new BigDecimal(3)); userCoupon.setSku(aaa1111); userCoupon.setUserId(11); supportPromotions.setUserCoupon(userCoupon); supportPromotionslist.put(PromotionType.COUPON, supportPromotions); SupportPromotions supportPromotions1 supportPromotions.clone(); supportPromotions1.setPromotionType(PromotionType.REDPACKED); supportPromotions1.setPriority(2); UserRedPacket userRedPacket new UserRedPacket(); userRedPacket.setId(1); userRedPacket.setRedPacket(new BigDecimal(10)); userRedPacket.setSku(aaa1111); userCoupon.setUserId(11); supportPromotions1.setUserRedPacket(userRedPacket); supportPromotionslist.put(PromotionType.REDPACKED, supportPromotions1); Merchandise merchandise new Merchandise(); merchandise.setSku(aaa1111); merchandise.setName(蘋果); merchandise.setPrice(new BigDecimal(20)); merchandise.setSupportPromotions(supportPromotionslist); ListOrderDetail OrderDetailList new ArrayListOrderDetail(); OrderDetail orderDetail new OrderDetail(); orderDetail.setId(1); orderDetail.setOrderId(1111); orderDetail.setMerchandise(merchandise); OrderDetailList.add(orderDetail); order.setList(OrderDetailList); return order; } public static void main(String[] args) throws InterruptedException, IOException { Order order new Order(); init(order); for (OrderDetail orderDetail : order.getList()) { BigDecimal payMoney PromotionFactory.getPayMoney(orderDetail); orderDetail.setPayMoney(payMoney); System.out.println(最終支付金額 orderDetail.getPayMoney()); } } }實際測試輸入商品原單價金額為20 紅包優(yōu)惠金額10 優(yōu)惠券金額3 最終支付金額7四、總結(jié)裝飾器模式以其靈活性和可擴(kuò)展性在軟件設(shè)計中具有不可忽視的價值。通過裝飾器模式我們能夠在不修改原有代碼的情況下為對象動態(tài)地添加功能。這種特性特別適合處理那些需要靈活組合和擴(kuò)展的業(yè)務(wù)需求。在本篇文章中我們通過對裝飾器模式概念和基本用法的講解結(jié)合商品價格策略優(yōu)化的實際案例展示了如何將這一設(shè)計模式應(yīng)用于現(xiàn)實問題提升系統(tǒng)的可擴(kuò)展性和維護(hù)性。在商品價格策略優(yōu)化的案例中裝飾器模式幫助我們應(yīng)對復(fù)雜的促銷組合場景允許多個優(yōu)惠規(guī)則如優(yōu)惠券、紅包等自由組合并靈活應(yīng)用。這種基于裝飾器模式的設(shè)計不僅增強了系統(tǒng)的可擴(kuò)展性也使得促銷策略的新增和變更變得更加高效和簡便。通過本文的學(xué)習(xí)您應(yīng)該能夠掌握裝飾器模式的核心思想并理解如何將其應(yīng)用于實際項目中。在未來的開發(fā)過程中當(dāng)面對復(fù)雜的需求和不斷變化的業(yè)務(wù)邏輯時裝飾器模式將為您提供一個高效的解決方案。希望您能將這一設(shè)計模式靈活應(yīng)用到自己的項目中提升代碼質(zhì)量并幫助團(tuán)隊更好地應(yīng)對復(fù)雜的業(yè)務(wù)需求。參考書籍、文獻(xiàn)和資料1.極客時間課程《Java性能調(diào)優(yōu)實戰(zhàn)》劉超2019.2.https://www.cnblogs.com/jzb-blog/p/6717349.html