哈喽,大家好,我们今天来看下装饰器模式。顾名思义,装饰的意思就是不改变原有的对象,只是进行对象的封装,提供额外的功能。

1: 简介

为一个现有对象添加额外的功能。就增加对象功能来说,装饰模式比生成子类实现更为灵活。这种模式创建了一个装饰类,用来包装原有的类,并在保持类方法签名完整性的前提下,提供了额外的功能。

2: 代码实例

//定义获取数据的接口
public interface Request {
void getData();
}

//从mysql中获取数据
public class MySQLRequest implements Request{
@Override
public void getData() {
System.out.println("从数据库获取数据");
}
}


//定义装饰器
public class Decorator implements Request{

private Request request;

public Decorator(Request request) {
this.request = request;
}

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


/**
* 记录日志 进行装饰器增强
*/
public class LogDecorator extends Decorator{

public LogDecorator(Request request) {
super(request);
}

@Override
public void getData() {
super.getData();
log();
}

private void log() {
System.out.println("记录获取数据的日志");
}
}

3: 适用场景

  • 动态的增加对象的功能
  • 不能以派生子类的方式进行扩展功能
  • 限制对象的执行条件
  • 参数控制和检查

4: 优缺点

优点:

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


缺点:

  • 没有继承结构清晰
  • 包裹层数比较多,难以理解和管理

5: 总结

从上面的我们可以看出,装饰器模式本质就是包装原有的类,并在保持类方法完整的前提下,提供额外的功能。