结构型模式-装饰器模式

结构型模式-装饰器模式

装饰器模式(Decorator Pattern)是一种结构型设计模式,它允许在不改变原有对象结构的情况下,动态地向对象添加额外的功能和行为。装饰器模式通过包装(装饰)原有对象,以增强其功能和特性。

装饰器模式的主要思想是将对象的行为分离为核心功能和附加功能,并通过组合的方式将它们组合在一起。这样,可以在运行时动态地添加、删除或修改对象的行为,而无需对原有对象进行修改。


装饰器模式包含角色

  1. 抽象组件(Component):

    定义了一个抽象接口,是装饰器和具体组件的共同接口。它可以是一个抽象类或接口,声明了核心功能的方法。

  2. 具体组件(Concrete Component):

    实现了抽象组件的接口,是被装饰的原有对象。它定义了核心功能的具体实现。

  3. 抽象装饰器(Decorator):

    实现了抽象组件的接口,并持有一个指向抽象组件的引用。它可以有多个具体装饰器进行扩展。抽象装饰器通常也实现了抽象组件的方法,并在方法中调用具体组件的对应方法。

  4. 具体装饰器(Concrete Decorator):

    扩展了抽象装饰器,并在其中添加额外的功能。具体装饰器可以嵌套其他具体装饰器,从而实现多层次的功能组合。


装饰器模式的工作流程

  1. 客户端通过抽象组件的接口创建具体组件的对象。
  2. 客户端可以选择将一个或多个具体装饰器包装在具体组件上,从而增强其功能。
  3. 客户端通过调用抽象组件的方法来使用对象,装饰器会在调用链中添加额外的功能。

装饰器模式的优点

  • 可以动态地添加、删除或修改对象的功能,无需修改原有对象的结构。
  • 可以通过组合不同的装饰器来实现不同的功能组合,提供了更大的灵活性。
  • 符合开闭原则,新增功能通过添加具体装饰器来实现,而无需修改原有代码。

装饰器模式适用场景

  • 当需要在不改变现有对象结构的情况下,增加额外的功能或行为时,可以使用装饰器模式。
  • 当需要动态地为对象添加或删除功能时,装饰器模式可以提供更灵活的解决方案。

装饰器模式示例

// 抽象组件
interface Coffee {
    String getDescription();
    double getCost();
}

// 具体组件
class SimpleCoffee implements Coffee {
    public String getDescription() {
        return "Simple Coffee";
    }

    public double getCost() {
        return 1.0;
    }
}

// 抽象装饰器
abstract class CoffeeDecorator implements Coffee {
    protected Coffee decoratedCoffee;

    public CoffeeDecorator(Coffee decoratedCoffee) {
        this.decoratedCoffee = decoratedCoffee;
    }

    public String getDescription() {
        return decoratedCoffee.getDescription();
    }

    public double getCost() {
        return decoratedCoffee.getCost();
    }
}

// 具体装饰器
class MilkDecorator extends CoffeeDecorator {
    public MilkDecorator(Coffee decoratedCoffee) {
        super(decoratedCoffee);
    }

    public String getDescription() {
        return super.getDescription() + ", Milk";
    }

    public double getCost() {
        return super.getCost() + 0.5;
    }
}

// 具体装饰器
class SugarDecorator extends CoffeeDecorator {
    public SugarDecorator(Coffee decoratedCoffee) {
        super(decoratedCoffee);
    }

    public String getDescription() {
        return super.getDescription() + ", Sugar";
    }

    public double getCost() {
        return super.getCost() + 0.2;
    }
}

// 客户端代码
public class Main {
    public static void main(String[] args) {
        Coffee coffee = new SimpleCoffee();
        Coffee milkCoffee = new MilkDecorator(coffee);
        Coffee sugarMilkCoffee = new SugarDecorator(milkCoffee);

        System.out.println(sugarMilkCoffee.getDescription());  // 输出:Simple Coffee, Milk, Sugar
        System.out.println(sugarMilkCoffee.getCost());  // 输出:1.7
    }
}

在上述示例中,Coffee是抽象组件,SimpleCoffee是具体组件。CoffeeDecorator是抽象装饰器,MilkDecoratorSugarDecorator是具体装饰器。客户端代码通过装饰器将额外的功能(牛奶和糖)添加到原有的咖啡对象上,从而增强了咖啡的描述和成本。

通过装饰器模式,可以动态地向对象添加额外的功能,而不会影响原有对象的结构和行为。这种模式可以在不修改源代码的情况下,实现对现有对象的功能扩展和变化。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

xinyi_java

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值