本文最后更新于 2025年7月25日 下午
动态地将责任附加到对象上,若要扩展功能,装饰者提供了比继承更有弹性的替代方案。
装饰器模式主要对现有的类对象进行包裹和封装,以期望在不改变类对象及其类定义的情况下对对象添加额外功能,是一种对象结构型模式
角色
Component : Component是一个接口或者抽象类,是定义最核心的对象,也可以说是最原始的对象
ComcreteComponent :是最核心,最原始,最基本的接口或抽象类实现,可以单独用也可以进行装饰
Decorator : 一般是一个抽象类,继承自或实现Component,在它的属性里面有一个变量指向Component抽象构件
ConcreteDecorator : 把基础构建装饰成新的东西
优点
- 相较于类的继承来扩展功能,对对象进行包裹更加灵活
- 装饰类和被装饰类相互独立,耦合度较低
缺点
- 没有继承结构清晰
- 包裹层数较多时,难以理解和管理
场景
- 动态地增加对象的功能,在原先的对象上增加功能
- 不能以派生子类的方式来扩展功能
- 限制对象的执行条件,在什么情况下,才能执行对象,否则抛出异常
- 参数控制和检查等,对参数的校验和检查,不通过就抛出异常
实现装饰器模式
所以在java中实现装饰器的原理是 目标类与装饰器类实现同一个类型接口,装饰器实现类接收该接口的实现类,并在其中对实现类进行调用,并进行扩展。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59
| public interface Camera { void operation(); }
public class TakePhotoCamera implements Camera{ @Override public void operation(){ System.out.println("拍照功能"); } }
public abstract class CameraDecorator implements Camera{ Camera camera ; public CameraDecorator(Camera camera){ this.camera = camera ; } }
public class BeautyCameraDecorator extends CameraDecorator { public BeautyCameraDecorator(Camera camera){ super(camera); } @Override public void operation(){ camera.operation(); System.out.println("扩展功能1"); } }
public class FilterCameraDecorator extends CameraDecorator{ public FilterCameraDecorator(Camera camera){ super(camera); } @Override public void operation(){ camera.operation(); System.out.println("扩展功能2"); } }
public class Test{ public static void main(String[] args){ Camera camera = new TakePhotoCamera(); camera.operation(); Camera camera1 = new BeautyCameraDecorator(new TakePhotoCamera()); camera1.operation(); Camera camera2 = new FilterCameratDecorator(new BeautyCameraDecorator(new TakePhotoCamera)); camera2.operation(); }
}
|
总结
装饰器模式是一种结构型设计模式,它通过将对象“包装”在装饰器类中,动态地为对象添加新的功能,而无需修改其原始代码或继承其子类。这种设计极大增强了系统的 灵活性与可扩展性 ,是继承机制的一种优雅替代方案。
在实现上,装饰器与被装饰对象实现相同的接口,并通过组合的方式将原始对象作为构造参数传入,从而在保留原有行为的基础上扩展功能。装饰器可以层层嵌套,实现功能叠加,符合开闭原则(对扩展开放,对修改封闭)的设计思想。
装饰器模式适用于希望对已有对象动态增强功能、限制继承扩展、或进行权限控制与参数校验的场景。虽然多层装饰可能导致调用结构复杂,但它提供了一种高内聚、低耦合、可组合的设计方式,是现代开发中非常实用的一种结构模式。