IT评测·应用市场-qidao123.com

标题: 2.装饰器模式 [打印本页]

作者: 飞不高    时间: 2025-3-14 03:40
标题: 2.装饰器模式
概述

装饰器模式:在原有结构,动态地为对象添加职责,它是一种机动的扩展功能方式。
业务场景:创建订单

假设你正在开发一个电商体系,用户在创建订单时可以选择差别的服务(如扣头、配送、礼物包装等)。你需要机动地盘算订单的总价,并能够动态地添加或移除这些服务。
核心头脑

在创建订单场景中的核心头脑是动态扩展,它通过组合而非继承的方式,创建时能不断扩展,订单对象传进入参不断扩展。

1. 根本组件接口 (Order)

  1. public interface Order {
  2.     double getTotalPrice(); // 获取订单总价
  3.     String getDescription(); // 获取订单描述
  4. }
复制代码
2. 具体组件 (BasicOrder)

  1. public class BasicOrder implements Order {
  2.     private double basePrice; // 订单基础价格
  3.     public BasicOrder(double basePrice) {
  4.         this.basePrice = basePrice;
  5.     }
  6.     @Override
  7.     public double getTotalPrice() {
  8.         return basePrice; // 返回基础价格
  9.     }
  10.     @Override
  11.     public String getDescription() {
  12.         return "基础订单(价格:" + basePrice + ")";
  13.     }
  14. }
复制代码
3. 装饰器基类 (OrderDecorator)

  1. public abstract class OrderDecorator implements Order {
  2.     protected Order decoratedOrder;
  3.     public OrderDecorator(Order order) {
  4.         this.decoratedOrder = order;
  5.     }
  6.     @Override
  7.     public double getTotalPrice() {
  8.         return decoratedOrder.getTotalPrice();
  9.     }
  10.     @Override
  11.     public String getDescription() {
  12.         return decoratedOrder.getDescription();
  13.     }
  14. }
复制代码
4. 具体装饰器 

扣头装饰器 DiscountDecorator

  1. public class DiscountDecorator extends OrderDecorator {
  2.     private double discountRate; // 折扣率
  3.     public DiscountDecorator(Order order, double discountRate) {
  4.         super(order);
  5.         this.discountRate = discountRate;
  6.     }
  7.     @Override
  8.     public double getTotalPrice() {
  9.         return super.getTotalPrice() * (1 - discountRate); // 应用折扣
  10.     }
  11.     @Override
  12.     public String getDescription() {
  13.         return super.getDescription() + " + 折扣(" + (discountRate * 100) + "%)";
  14.     }
  15. }
复制代码
加急配送装饰器 ExpressShippingDecorator

  1. public class ExpressShippingDecorator extends OrderDecorator {
  2.     private double expressShippingFee; // 加急配送费用
  3.     public ExpressShippingDecorator(Order order, double expressShippingFee) {
  4.         super(order);
  5.         this.expressShippingFee = expressShippingFee;
  6.     }
  7.     @Override
  8.     public double getTotalPrice() {
  9.         return super.getTotalPrice() + expressShippingFee; // 添加加急配送费用
  10.     }
  11.     @Override
  12.     public String getDescription() {
  13.         return super.getDescription() + " + 加急配送(费用:" + expressShippingFee + ")";
  14.     }
  15. }
复制代码
礼物包装装饰器 GiftWrapDecorator

  1. public class GiftWrapDecorator extends OrderDecorator {
  2.     private double giftWrapFee; // 礼品包装费用
  3.     public GiftWrapDecorator(Order order, double giftWrapFee) {
  4.         super(order);
  5.         this.giftWrapFee = giftWrapFee;
  6.     }
  7.     @Override
  8.     public double getTotalPrice() {
  9.         return super.getTotalPrice() + giftWrapFee; // 添加礼品包装费用
  10.     }
  11.     @Override
  12.     public String getDescription() {
  13.         return super.getDescription() + " + 礼品包装(费用:" + giftWrapFee + ")";
  14.     }
  15. }
复制代码

5. 客户端代码

  1. public class OrderSystem {
  2.     public static void main(String[] args) {
  3.         // 创建一个基础订单
  4.         Order order = new BasicOrder(100.0);
  5.         System.out.println(order.getDescription());
  6.         System.out.println("总价: " + order.getTotalPrice());
  7.         // 添加折扣
  8.         order = new DiscountDecorator(order, 0.1); // 10% 折扣
  9.         System.out.println(order.getDescription());
  10.         System.out.println("总价: " + order.getTotalPrice());
  11.         // 添加加急配送
  12.         order = new ExpressShippingDecorator(order, 15.0); // 加急配送费用 15
  13.         System.out.println(order.getDescription());
  14.         System.out.println("总价: " + order.getTotalPrice());
  15.         // 添加礼品包装
  16.         order = new GiftWrapDecorator(order, 5.0); // 礼品包装费用 5
  17.         System.out.println(order.getDescription());
  18.         System.out.println("总价: " + order.getTotalPrice());
  19.     }
  20. }
复制代码

6. 输出

  1. 基础订单(价格:100.0)
  2. 总价: 100.0
  3. 基础订单(价格:100.0) + 折扣(10.0%)
  4. 总价: 90.0
  5. 基础订单(价格:100.0) + 折扣(10.0%) + 加急配送(费用:15.0)
  6. 总价: 105.0
  7. 基础订单(价格:100.0) + 折扣(10.0%) + 加急配送(费用:15.0) + 礼品包装(费用:5.0)
  8. 总价: 110.0
复制代码

业务场景总结


其他业务场景

装饰器模式在创建订单场景中的核心头脑是动态扩展,它通过组合而非继承的方式,机动地为订单添加功能或服务。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。




欢迎光临 IT评测·应用市场-qidao123.com (https://dis.qidao123.com/) Powered by Discuz! X3.4