装饰器模式

本文最后更新于 2025年7月25日 下午

动态地将责任附加到对象上,若要扩展功能,装饰者提供了比继承更有弹性的替代方案。

装饰器模式主要对现有的类对象进行包裹和封装,以期望在不改变类对象及其类定义的情况下对对象添加额外功能,是一种对象结构型模式

角色

Component : Component是一个接口或者抽象类,是定义最核心的对象,也可以说是最原始的对象

ComcreteComponent :是最核心,最原始,最基本的接口或抽象类实现,可以单独用也可以进行装饰

Decorator : 一般是一个抽象类,继承自或实现Component,在它的属性里面有一个变量指向Component抽象构件

ConcreteDecorator : 把基础构建装饰成新的东西

优点

  1. 相较于类的继承来扩展功能,对对象进行包裹更加灵活
  2. 装饰类和被装饰类相互独立,耦合度较低

缺点

  1. 没有继承结构清晰
  2. 包裹层数较多时,难以理解和管理

场景

  1. 动态地增加对象的功能,在原先的对象上增加功能
  2. 不能以派生子类的方式来扩展功能
  3. 限制对象的执行条件,在什么情况下,才能执行对象,否则抛出异常
  4. 参数控制和检查等,对参数的校验和检查,不通过就抛出异常

实现装饰器模式

所以在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();
}

}

总结

装饰器模式是一种结构型设计模式,它通过将对象“包装”在装饰器类中,动态地为对象添加新的功能,而无需修改其原始代码或继承其子类。这种设计极大增强了系统的 灵活性与可扩展性 ,是继承机制的一种优雅替代方案。

在实现上,装饰器与被装饰对象实现相同的接口,并通过组合的方式将原始对象作为构造参数传入,从而在保留原有行为的基础上扩展功能。装饰器可以层层嵌套,实现功能叠加,符合开闭原则(对扩展开放,对修改封闭)的设计思想。

装饰器模式适用于希望对已有对象动态增强功能、限制继承扩展、或进行权限控制与参数校验的场景。虽然多层装饰可能导致调用结构复杂,但它提供了一种高内聚、低耦合、可组合的设计方式,是现代开发中非常实用的一种结构模式。


装饰器模式
http://gadoid.io/2025/07/25/装饰器模式/
作者
Codfish
发布于
2025年7月25日
许可协议