装饰者模式

装饰者模式

装饰者模式(Decorator Pattern)是一种结构型设计模式,主要用于动态地给对象添加额外的功能,而不改变其结构。这个模式通过创建一个装饰类来包装原始对象,从而扩展其功能。

主要角色

  1. 组件(Component):定义一个接口或抽象类,声明可以被装饰的对象所共有的接口。
  2. 具体组件(ConcreteComponent):实现了组件接口的具体类,代表需要装饰的对象。
  3. 装饰者(Decorator):持有一个组件对象的引用,并实现组件接口。装饰者可以在调用原始组件的方法之前或之后,添加额外的功能。
  4. 具体装饰者(ConcreteDecorator):继承自装饰者,具体实现要添加的功能。

结构示例

假设你有一个简单的 Coffee 类,想要动态地给它添加不同的配料,比如牛奶或糖。你可以通过装饰者模式来实现。

  1. 组件接口 Beverage

    public interface Beverage {
    String getDescription();
    double cost();
    }
  2. 具体组件 Coffee

    public class Coffee implements Beverage {
    @Override
    public String getDescription() {
    return "Coffee";
    }
    @Override
    public double cost() {
    return 2.00;
    }
    }
  3. 装饰者基类 BeverageDecorator

    public abstract class BeverageDecorator implements Beverage {
    protected Beverage beverage;
    public BeverageDecorator(Beverage beverage) {
    this.beverage = beverage;
    }
    @Override
    public abstract String getDescription();
    }
  4. 具体装饰者 MilkDecorator

    public class MilkDecorator extends BeverageDecorator {
    public MilkDecorator(Beverage beverage) {
    super(beverage);
    }
    @Override
    public String getDescription() {
    return beverage.getDescription() + ", Milk";
    }
    @Override
    public double cost() {
    return beverage.cost() + 0.50; // 假设牛奶的费用是 $0.50
    }
    }
  5. 具体装饰者 SugarDecorator

    public class SugarDecorator extends BeverageDecorator {
    public SugarDecorator(Beverage beverage) {
    super(beverage);
    }
    @Override
    public String getDescription() {
    return beverage.getDescription() + ", Sugar";
    }
    @Override
    public double cost() {
    return beverage.cost() + 0.25; // 假设糖的费用是 $0.25
    }
    }
  6. 测试类 TestDecoratorPattern

    public class TestDecoratorPattern {
    public static void main(String[] args) {
    // 创建一个基础的咖啡对象
    Beverage coffee = new Coffee();
    System.out.println("Description: " + coffee.getDescription()); // Output: Coffee
    System.out.println("Cost: $" + coffee.cost()); // Output: 2.00
    // 添加牛奶装饰
    Beverage milkCoffee = new MilkDecorator(coffee);
    System.out.println("Description: " + milkCoffee.getDescription()); // Output: Coffee, Milk
    System.out.println("Cost: $" + milkCoffee.cost()); // Output: 2.50
    // 添加糖装饰
    Beverage milkSugarCoffee = new SugarDecorator(milkCoffee);
    System.out.println("Description: " + milkSugarCoffee.getDescription()); // Output: Coffee, Milk, Sugar
    System.out.println("Cost: $" + milkSugarCoffee.cost()); // Output: 2.75
    }
    }

解释

  • 组件接口 Beverage 定义了所有饮料的基本接口,包括获取描述和计算费用的方法。
  • 具体组件 Coffee 实现了 Beverage 接口,提供了基础的咖啡描述和费用。
  • 装饰者基类 BeverageDecorator 维护了一个 Beverage 对象的引用,并实现了 Beverage 接口,但 getDescription 方法是抽象的,具体装饰者需要实现它。
  • 具体装饰者 MilkDecoratorSugarDecorator 实现了 BeverageDecorator,分别添加了牛奶和糖的描述和费用。
  • 测试类 TestDecoratorPattern 演示了如何使用装饰者模式来动态地添加功能,并打印了结果。

通过装饰者模式,可以灵活地组合和扩展对象的功能,而不需要修改对象的原始代码。

posted @   疾风不问归途  阅读(9)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· CSnakes vs Python.NET:高效嵌入与灵活互通的跨语言方案对比
· DeepSeek “源神”启动!「GitHub 热点速览」
· 我与微信审核的“相爱相杀”看个人小程序副业
· Plotly.NET 一个为 .NET 打造的强大开源交互式图表库
· 上周热点回顾(2.17-2.23)
点击右上角即可分享
微信分享提示