装饰者模式是一种结构型设计模式, 它允许在不改变对象自身的情况下动态地为对象添加行为和职责. 装饰者模式通过创建一个装饰者类来包裹原始类, 从而增强或修改其功能

装饰者模式结构

  • 组件接口: 定义了对象的公共操作的接口或抽象类, 定义了对象的公共操作
  • 具体组件: 具体的定义类, 实现组件接口
  • 装饰者: 这是抽象类, 实现组件接口, 并持有一个组件对象的引用, 它通过组合方式将客户端的请求转发给被装饰的对象, 具体的装饰者类将从这个抽象修饰者继承并拓展其功能
  • 具体装饰者: 装饰者模式的核心部分, 具体装饰者类从装饰者类继承, 并通过创建新的方法或重写组件方法来增强或改变被装饰对象的行为

装饰者模式实现

interface Component {
void request();
}

class ConcreteComponent implements Component {
@Override
public void request() {
System.out.println("ConcreteComponent: request");
}
}

abstract class ComponentDecorator implements Component {
protect Component component;

public ComponentDecorator(Component component) {
this.component = component;
}

@Override
public void request() {
component.request();
}
}

class ConcreteDecorator1 extends ComponentDecorator {
public ConcreteDecorator(Component component) {
super(component);
}

@Override
public void request() {
component.request();
System.out.println("ConcreteDecorator1: request");
}
}

class ConcreteDecorator2 extends ComponentDecorator {
public ConcreteDecorator(Component component) {
super(component);
}

@Override
public void request() {
component.request();
System.out.println("ConcreteDecorator2: request");
}
}

public class Client {
public static void main(String[] args) {
Component component = new ComponentDecorator();
component.request();

component = new ConcreteDecorator1(component);
component.request();

component = new ComcreteDecorator2(component);
component.request();
}
}

优点:

  • 比继承更加灵活,使用也更加方便, 装饰者模式可以通过组合不同的装饰者对象获取不同行为的对象.
  • 装饰类和被装饰类是独立的, 不会相互耦合