设计模式 - 装饰器模式
封面图
•
2025-11-09
•
设计模式
0
0
0
0
装饰器模式(Decorator Pattern)是一种**结构型设计模式**,它允许在不修改原有对象结构的情况下,动态地给对象添加职责。通过组合而非继承的方式,实现功能的扩展,避免了类爆炸的问题。 --- ## 一、定义 装饰器模式:**在不改变对象自身结构的前提下,动态地给对象添加职责**。它通过组合方式替代继承,使得对象可以灵活地扩展功能。 --- ## 二、核心思想 - **组合优于继承**:通过将功能封装为装饰器对象,与原始对象组合使用。 - **动态添加功能**:可以在运行时动态地为对象添加或移除功能。 - **保持接口一致性**:装饰器和被装饰对象拥有相同的接口,客户端无需关心具体实现。 --- ## 三、结构图(UML) ``` Component | +-- ConcreteComponent | +-- Decorator (抽象装饰器) | +-- ConcreteDecoratorA +-- ConcreteDecoratorB ``` --- ## 四、关键角色 | 角色 | 职责 | |------|------| | **Component** | 定义一个对象的接口,可以是抽象类或接口。 | | **ConcreteComponent** | 实现基础功能的对象。 | | **Decorator** | 抽象装饰器,继承自 Component,包含对 Component 的引用,并实现相同接口。 | | **ConcreteDecorator** | 具体装饰器,负责添加额外的功能。 | --- ## 五、示例代码(Java) ### 1. 定义组件接口 ```java interface Coffee { double cost(); String description(); } ``` ### 2. 具体组件 ```java class BlackCoffee implements Coffee { @Override public double cost() { return 2.0; } @Override public String description() { return "Black Coffee"; } } ``` ### 3. 装饰器抽象类 ```java abstract class CoffeeDecorator implements Coffee { protected Coffee decoratedCoffee; public CoffeeDecorator(Coffee coffee) { this.decoratedCoffee = coffee; } @Override public double cost() { return decoratedCoffee.cost(); } @Override public String description() { return decoratedCoffee.description(); } } ``` ### 4. 具体装饰器 ```java class Milk extends CoffeeDecorator { public Milk(Coffee coffee) { super(coffee); } @Override public double cost() { return decoratedCoffee.cost() + 0.5; } @Override public String description() { return decoratedCoffee.description() + ", Milk"; } } class Sugar extends CoffeeDecorator { public Sugar(Coffee coffee) { super(coffee); } @Override public double cost() { return decoratedCoffee.cost() + 0.2; } @Override public String description() { return decoratedCoffee.description() + ", Sugar"; } } ``` ### 5. 使用示例 ```java public class Main { public static void main(String[] args) { Coffee coffee = new BlackCoffee(); System.out.println("Cost: " + coffee.cost() + ", Description: " + coffee.description()); coffee = new Milk(coffee); System.out.println("Cost: " + coffee.cost() + ", Description: " + coffee.description()); coffee = new Sugar(coffee); System.out.println("Cost: " + coffee.cost() + ", Description: " + coffee.description()); } } ``` ### 输出: ``` Cost: 2.0, Description: Black Coffee Cost: 2.5, Description: Black Coffee, Milk Cost: 2.7, Description: Black Coffee, Milk, Sugar ``` --- ## 六、优点 - **灵活扩展功能**:不需要修改已有代码,只需添加新的装饰器。 - **避免类爆炸**:避免了因继承带来的子类爆炸问题。 - **符合开闭原则**:对扩展开放,对修改关闭。 --- ## 七、缺点 - **增加系统复杂度**:过多的装饰器可能让系统变得难以理解。 - **调试困难**:由于层层包装,调试时可能需要跟踪多个装饰器。 --- ## 八、适用场景 - 需要动态地为对象添加功能,且希望这些功能可以随时切换。 - 不希望使用继承来扩展对象功能。 - 需要组合多个功能,而不想创建大量子类。 --- ## 九、常见应用 - Java I/O 流(如 `BufferedInputStream`、`DataInputStream` 等) - GUI 框架中对控件的增强(如添加边框、背景等) - 日志记录、权限校验等横切关注点的处理 --- 如果你有具体的业务场景,我可以帮你设计一个装饰器模式的应用方案 😊
上一篇:
设计模式 - 组合模式
标题录入,一次不能超过6条
留言
评论