零售POS系统商品对象设计疑问:如何适配客户专属定价?
嘿,我之前做零售POS系统的时候刚好碰到过几乎一模一样的需求!给你几个实用的设计思路,应该能帮你解决这个商品定价结构的瓶颈:
方案1:拆分基础定价与客户专属定价,引入独立定价类
这种方案遵循单一职责原则,把商品基础信息和定价逻辑拆分开,后续扩展新定价类型(比如会员价、促销价)会更灵活。
首先调整商品类,只保留核心属性,把定价部分抽成独立的类:
// 基础商品类:只负责存储商品核心信息 class Item { private String name; // 关联基础定价模板 private BasePricing basePricing; // 构造函数、getter、setter 省略 } // 基础定价模板:存储通用的默认价格 class BasePricing { private double storePickupPrice; // 原priceA:到店自提价 private double deliveryPriceZoneA; // 原priceB:A类地址配送价 private double deliveryPriceZoneB; // 原priceC:B类地址配送价 // getter、setter 省略 } // 客户专属定价:关联特定客户与对应的专属价格 class CustomerSpecificPricing { private String customerId; // 客户唯一标识 private double customStorePickupPrice; private double customDeliveryPriceZoneA; private double customDeliveryPriceZoneB; private Item targetItem; // 关联对应的商品,也可以用itemId做外键 // getter、setter 省略 }
使用时的逻辑很清晰:查询商品价格时,先找该客户对应的CustomerSpecificPricing,如果存在就用专属价,否则 fallback 到BasePricing的基础价。
方案2:在商品类中嵌入客户专属定价Map(紧凑版)
如果你的系统暂时不需要太复杂的扩展,只想保持代码紧凑,可以直接在Item类里加一个Map来存储客户专属定价,避免拆分过多类:
class Item { private String name; // 基础定价 private double baseStorePickupPrice; private double baseDeliveryPriceZoneA; private double baseDeliveryPriceZoneB; // 存储客户专属定价:key为客户ID,value为该客户的专属定价 private Map<String, CustomerPricing> customerPricingMap = new HashMap<>(); // 封装价格获取逻辑,对外提供统一接口 public double getStorePickupPrice(String customerId) { CustomerPricing customPricing = customerPricingMap.get(customerId); return customPricing != null ? customPricing.getStorePickupPrice() : baseStorePickupPrice; } // 同理实现getDeliveryPriceZoneA、getDeliveryPriceZoneB方法 } // 客户专属定价实体 class CustomerPricing { private double storePickupPrice; private double deliveryPriceZoneA; private double deliveryPriceZoneB; // getter、setter 省略 }
这种方式的优势是调用起来非常方便,上层代码只需要通过Item的方法就能直接拿到对应客户的价格,不用额外处理多类关联的逻辑。
额外实用建议
- 一定要封装好定价优先级逻辑:客户专属价 > 基础价,把这个判断逻辑放在底层(比如Item的价格获取方法里),不要让上层业务代码重复处理
- 如果未来可能新增更多定价类型(比如限时促销价、会员等级价),建议考虑用策略模式,把不同定价规则做成独立的策略类,扩展性会更强
- 数据库持久化时,客户专属定价建议单独建一张中间表(比如
item_customer_pricing),存储item_id、customer_id和对应的三个专属价格,避免数据冗余
内容的提问来源于stack exchange,提问作者cutecutebj
相关产品推荐
相关产品推荐

