哈喽,大家好,我们今天来看下装饰器模式。顾名思义,装饰的意思就是不改变原有的对象,只是进行对象的封装,提供额外的功能。
1: 简介
为一个现有对象添加额外的功能。就增加对象功能来说,装饰模式比生成子类实现更为灵活。这种模式创建了一个装饰类,用来包装原有的类,并在保持类方法签名完整性的前提下,提供了额外的功能。
2: 代码实例
//定义获取数据的接口
public interface Request {
void getData();
}
//从mysql中获取数据
public class MySQLRequest implements Request{
public void getData() {
System.out.println("从数据库获取数据");
}
}
//定义装饰器
public class Decorator implements Request{
private Request request;
public Decorator(Request request) {
this.request = request;
}
public void getData() {
request.getData();
}
}
/**
* 记录日志 进行装饰器增强
*/
public class LogDecorator extends Decorator{
public LogDecorator(Request request) {
super(request);
}
public void getData() {
super.getData();
log();
}
private void log() {
System.out.println("记录获取数据的日志");
}
}
3: 适用场景
- 动态的增加对象的功能
- 不能以派生子类的方式进行扩展功能
- 限制对象的执行条件
- 参数控制和检查
4: 优缺点
优点:
- 相对于类的继承来扩展功能,对对象进行包裹更加的灵活
- 装饰类和被装饰类相互独立,耦合度降低
缺点:
- 没有继承结构清晰
- 包裹层数比较多,难以理解和管理
5: 总结
从上面的我们可以看出,装饰器模式本质就是包装原有的类,并在保持类方法完整的前提下,提供额外的功能。