
装饰模式是常见的Java设计模式之一,用途非常的广,下面我就重点详解装饰模式的实现与使用@mikechen
装饰模式定义
装饰模式(Decorator Pattern)是一种结构型设计模式,它允许在不改变对象的基本结构的情况下,动态地给一个对象添加新的功能。
装饰模式使用场景
装饰模式通常适用于以下场景:
- 在不改变已有代码的情况下,动态地为对象增加新的功能,避免修改原有代码带来的风险。
- 需要扩展一个类的功能,但是使用继承会导致类的数目增加,不利于代码的维护。
- 需要动态地给一个对象增加一些额外的职责,而且这些职责可以被动态地撤销,例如在运行时动态地给一个窗口控件增加边框、滚动条等功能。
装饰模式实现
装饰模式的实现,包含以下角色:

1.抽象组件(Component)
定义被装饰对象的接口,可以是一个抽象类或接口。
2.具体组件(Concrete Component)
实现抽象组件接口,即被装饰的对象。
3.抽象装饰器(Decorator)
继承自抽象组件,包含一个指向抽象组件的引用,以及一个实现抽象组件接口的方法。
4.具体装饰器(Concrete Decorator)
继承自抽象装饰器,实现自己的装饰逻辑,并在必要的时候调用被装饰对象的方法。
5.客户端(Client)
创建被装饰对象,并通过一系列装饰器来对被装饰对象进行装饰。
装饰模式使用实例
下面是一个装饰模式的示例代码:
// 抽象组件
interface Component {
void operation();
}
// 具体组件
class ConcreteComponent implements Component {
@Override
public void operation() {
System.out.println("ConcreteComponent operation");
}
}
// 抽象装饰类
abstract class Decorator implements Component {
protected Component component;
public Decorator(Component component) {
this.component = component;
}
public void operation() {
component.operation();
}
}
// 具体装饰类A
class ConcreteDecoratorA extends Decorator {
public ConcreteDecoratorA(Component component) {
super(component);
}
public void operation() {
super.operation();
System.out.println("ConcreteDecoratorA operation");
}
}
// 具体装饰类B
class ConcreteDecoratorB extends Decorator {
public ConcreteDecoratorB(Component component) {
super(component);
}
public void operation() {
super.operation();
System.out.println("ConcreteDecoratorB operation");
}
}
// 客户端
public class Client {
public static void main(String[] args) {
Component component = new ConcreteComponent();
component = new ConcreteDecoratorA(component);
component = new ConcreteDecoratorB(component);
component.operation();
}
}
在上述示例代码中:
- 抽象组件 Component 定义了被装饰对象的接口;
- 具体组件 ConcreteComponent 是被装饰的对象;
- 抽象装饰类 Decorator 是所有具体装饰类的基类,定义了一个组件对象的引用,并实现了抽象组件的接口;
- 具体装饰类 ConcreteDecoratorA 和 ConcreteDecoratorB 继承自抽象装饰类 Decorator,并实现了自己的装饰功能。
以上就是装饰模式详解,更多设计模式请查看:Java设计模式:23种设计模式(万字图文全面总结)
mikechen睿哥
10年+一线大厂架构实战经验,就职于阿里、淘宝等一线大厂,操盘多个亿级大厂核心项目。