1、什么是装饰器模式?

Attach additional responsibilities to an object dynamically keeping the same interface.Decorators provide a flexible

alternative to subclassing for extending functionality.

装饰器模式(Decorator Pattern):动态的给一个对象添加额外的职责,就增加功能来说, 装饰模式相比生成子类更为灵活。

说人话:一般的,我们为了扩展一个类经常使用继承方式实现,随着扩展功能的增多,子类会很膨胀。这时候期望在不改变类对象及其类定义的情况下,为对象添加额外功能,这就是装饰器模式。

2、装饰器模式定义

①、Component抽象构件

Component是一个接口或者是抽象类, 就是定义我们最核心的对象, 也就是最原始的对象。

②、ConcreteComponent 具体构件

ConcreteComponent是最核心、 最原始、 最基本的接口或抽象类的实现, 你要装饰的就是它。

③、Decorator装饰角色

一般是一个抽象类, 实现接口或者抽象方法, 它里面可不一定有抽象的方法, 在它的属性里必然有一个private变量指向Component抽象构件。

④、ConcreteDecorator 具体装饰角色

ConcreteDecoratorA和ConcreteDecoratorB是两个具体的装饰类, 你要把你最核心的、 最原始的、 最基本的东西装饰成其他东西

3、装饰器模式通用代码实现

/**
* 抽象构件
*/
public abstract class Component {
public abstract void operator();
}
/**
* 具体构件
*/
public class ConcreteComponent extends Component{
@Override
public void operator() {
System.out.println("doSomething");
}
}
/**
* 抽象装饰者
*/
public abstract class Decorator extends Component{
private Component component; public Decorator(Component component){
this.component = component;
} // 委托给被修饰者执行
@Override
public void operator() {
this.component.operator();
}
}
public class ConcreteDecorator1 extends Decorator{
// 定义被修饰者
public ConcreteDecorator1(Component component){
super(component);
} // 定义自己的修饰方法
public void method1(){
System.out.println("修饰方法 method1");
}
@Override
public void operator() {
this.method1();
super.operator();
}
}
public class ConcreteDecorator2 extends Decorator{
// 定义被修饰者
public ConcreteDecorator2(Component component){
super(component);
} // 定义自己的修饰方法
public void method2(){
System.out.println("修饰方法 method2");
}
@Override
public void operator() {
super.operator();
this.method2();
}
}

客户端测试:

public class DecoratorClient {
public static void main(String[] args) {
Component component = new ConcreteComponent();
// 第一次修饰
component = new ConcreteDecorator1(component);
// 第二次修饰
component = new ConcreteDecorator2(component);
// 修饰后运行
component.operator();
}
}

打印结果:

4、装饰器模式优点

①、装饰模式可以动态地扩展一个实现类的功能。

②、装饰类和被装饰类可以独立发展, 而不会相互耦合。 换句话说, Component类无须知道Decorator类, Decorator类是从外部来扩展Component类的功能, 而Decorator也不用知道具体的构件。

③、装饰模式是继承关系的一个替代方案。 我们看装饰类Decorator, 不管装饰多少层, 返回的对象还是Component, 实现的还是is-a的关系

5、装饰器模式应用场景

①、需要扩展一个类的功能, 或给一个类增加附加功能。

②、需要动态地给一个对象增加功能, 这些功能可以再动态地撤销。

最新文章

  1. Unix/Linux进程间通信(一):概述
  2. ffmpeg-20160803-bin.7z
  3. Vim的可视模式
  4. uva 10077 - The Stern-Brocot Number System
  5. HTTP2.0协议
  6. hdu3720 Arranging Your Team
  7. 学习笔记-echarts x,y轴样式
  8. EasyUI 冻结列
  9. Python快速学习10: 循环的对象及设计 (生活的规律)
  10. MySQL 各级别事务的实现机制
  11. 3D 特征点概述(2)
  12. [剑指Offer]53-在排序数组中查找数字(二分查找)
  13. What is OpenOCD?
  14. 前端 HTML标签介绍
  15. 软工之404 Note Found队选题报告
  16. 利用Spring MVC 上传图片文件
  17. ZLYD团队第一周项目总结
  18. oracle 安装包
  19. ICE实现服务器客户端
  20. Angular-ui/bootstarp modal 主控制器与模态框控制器传值

热门文章

  1. 订单峰值激增 230%,Serverless 如何为世纪联华降本超 40%?|双11 云原生实践
  2. Django实现用户登录注册
  3. CF123E Maze(期望dp,树形dp,式子)
  4. postman如何解决下个接口依赖上一个接口数据
  5. NX CAM 区域轮廓铣的切削步长
  6. C语言知识_1
  7. centos7 配置ftp服务器搭建(匿名访问,以及本地登录)
  8. vue3.x异步组件
  9. Java:异常小记
  10. [no code][scrum meeting] Beta 6