2026-10-21 05:25:41
装饰器模式(Decorator Pattern)是一种结构型设计模式,它允许向一个现有的对象添加新的功能,同时又不改变其结构。这种模式创建了一个装饰类,用来包装原有的类,并在保持类方法签名完整性的前提下,提供了额外的功能。
装饰器模式的特点原接口不动,增加新的装饰类:装饰器模式通过创建一个新的装饰类来包装原始类,而不是直接修改原始类。这样,原始类的接口保持不变,符合开闭原则(对扩展开放,对修改关闭)。
原方法名不变,只是增加或修饰此方法体:装饰类通常会实现与原始类相同的接口,并重写其中的方法。在重写的方法中,装饰类会先执行一些额外的操作(如设置颜色、添加边框等),然后再调用原始类的方法。
装饰类持有原对象,只是增加了修饰:装饰类内部通常会包含一个原始类的实例,通过这个实例来调用原始类的方法。这样,装饰类可以在不改变原始类功能的基础上,增加新的功能。
以下是一个简单的装饰器模式实现示例,用于在绘制图形时添加颜色:
// 原始接口public interface Shape { void draw();}// 原始实现类public class Circle implements Shape { @Override public void draw() { System.out.println("Drawing a circle"); }}// 装饰器抽象类public abstract class ShapeDecorator implements Shape { protected Shape shape; public ShapeDecorator(Shape shape) { this.shape = shape; } @Override public void draw() { shape.draw(); }}// 具体装饰器类:添加颜色public class ColorShapeDecorator extends ShapeDecorator { public ColorShapeDecorator(Shape shape) { super(shape); } @Override public void draw() { setColor(); shape.draw(); } private void setColor() { System.out.println("Setting color to red"); }}// 使用示例public class Main { public static void main(String[] args) { Shape circle = new Circle(); Shape redCircle = new ColorShapeDecorator(new Circle()); System.out.println("Drawing a normal circle:"); circle.draw(); System.out.println("nDrawing a red circle:"); redCircle.draw(); }}装饰器模式的优点扩展功能:装饰器模式提供了一种比继承更加灵活的扩展功能的方式。可以在不修改原始类的情况下,通过装饰器类来添加新的功能。
保持接口一致性:装饰器类实现了与原始类相同的接口,因此客户端代码可以无缝地切换使用原始类或装饰器类。
多层装饰:可以通过嵌套多个装饰器类来实现多层装饰,从而添加多个功能。
动态添加功能:当需要在运行时动态地给对象添加功能时,可以使用装饰器模式。
避免子类膨胀:当使用继承会导致子类数量急剧增加时,可以考虑使用装饰器模式来替代。
功能组合:当需要将多个功能组合在一起使用时,装饰器模式可以提供一种灵活的方式来实现。
装饰器模式是一种强大的设计模式,它允许在不修改原始类的情况下,通过装饰器类来动态地添加新的功能。这种模式在需要扩展功能、保持接口一致性以及避免子类膨胀等场景下非常有用。通过合理地使用装饰器模式,可以提高代码的可维护性和可扩展性。