设计模式之装饰器模式

装饰器模式是一种结构型设计模式,通过在运行时为对象添加新职责,提供灵活性而不影响原有类。它包含组件、具体组件、装饰器和具体装饰器等角色,适用于动态扩展功能且继承不适用的场景。示例展示了如何使用装饰器模式创建具有不同功能的咖啡对象。
摘要由CSDN通过智能技术生成

装饰器模式详解

装饰器模式是一种结构型设计模式,允许你通过将对象放入包含行为的特殊封装对象中来为原对象绑定新的行为。这种类型的设计模式属于结构型模式,它结合了多个独立的接口,以提供更灵活的行为。

1. 什么是装饰器模式?

装饰器模式允许行为在运行时被附加到对象,而不会影响其他对象。它是继承关系的一个替代方案,通过这种方式可以使每个类的功能保持独立并且不受其他类的影响。

2. 模式结构

装饰器模式包含以下主要角色:

  • Component(组件): 定义一个对象接口,可以给这些对象动态地添加职责。

  • ConcreteComponent(具体组件): 实现Component接口,可以被装饰器附加新的职责。

  • Decorator(装饰器): 持有一个Component对象的引用,并定义一个与Component接口一致的接口。

  • ConcreteDecorator(具体装饰器): 扩展Decorator类,添加一些额外的职责。

3. 优缺点比较

优点缺点
允许向一个现有的对象添加新的功能将类的标识性质、功能性质和实现性质相互耦合
可以提供比继承更多的灵活性过多使用装饰器会使系统变得复杂
遵循开闭原则

4. 使用场景

装饰器模式通常在以下情况下使用:

  • 当需要动态地给一个对象添加额外的职责时。
  • 当要扩展一个类的功能,且继承不是可行的或者不太容易实现的。

5. 示例代码

// 1. Component 组件接口
public interface Coffee {
    double cost();
}

// 2. ConcreteComponent 具体组件
public class SimpleCoffee implements Coffee {
    @Override
    public double cost() {
        return 5;
    }
}

// 3. Decorator 装饰器
public abstract class CoffeeDecorator implements Coffee {
    private final Coffee decoratedCoffee;

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

    @Override
    public double cost() {
        return decoratedCoffee.cost();
    }
}

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

    @Override
    public double cost() {
        return super.cost() + 2;
    }
}

public class SugarDecorator extends CoffeeDecorator {
    public SugarDecorator(Coffee decoratedCoffee) {
        super(decoratedCoffee);
    }

    @Override
    public double cost() {
        return super.cost() + 1;
    }
}

// 5. Client 客户端
public class Client {
    public static void main(String[] args) {
        Coffee coffee = new SimpleCoffee();
        System.out.println("Cost of Simple Coffee: " + coffee.cost());

        Coffee milkCoffee = new MilkDecorator(coffee);
        System.out.println("Cost of Milk Coffee: " + milkCoffee.cost());

        Coffee sugarMilkCoffee = new SugarDecorator(milkCoffee);
        System.out.println("Cost of Sugar Milk Coffee: " + sugarMilkCoffee.cost());
    }
}

以上示例中,SimpleCoffee 是具体组件,MilkDecoratorSugarDecorator 是具体装饰器。客户端可以通过组合不同的装饰器来构建具有不同功能的咖啡。这种方式保持了组件的独立性,并允许在运行时动态地为对象添加新的职责。

  • 4
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值