<装饰模式是继承的一个替代模式>
概念理解
-
定义:在不改变原有类的结构基础上,动态地给一个对象添加一些额外的职责。就增加功能来说,装饰器模式相比生成子类更为灵活。
Component:原始组件的抽象类或者接口
ConcreteComponent:原始的组件对象,通常是被装饰器装饰的原始对象;
Decorator:装饰器的抽象类或者接口。为了实现装饰器功能的复用,需要继承组件接口类Component;并持有一个Component对象。(如果不继承组件接口类Component,则只能为某个组件添加单一的功能,即装饰器对象不能在装饰其他的装饰器对象。)
ConcreteDecorator:具体的装饰器类,实现向被装饰对象添加的不同的功能。
应用和优缺点
解决问题:
避免子类膨胀:扩展一个类经常使用继承方式实现,由于继承为类引入静态特征,并且随着扩展功能的增多,子类会很膨胀。应用实例:
1、装饰模式为已有类动态附加额外的功能就像LOL、王者荣耀等类Dota游戏中,英雄升级一样。每次英雄升级都会附加一个额外技能点学习技能。具体的英雄就是ConcreteComponent,技能栏就是装饰器Decorator,每个技能就是ConcreteDecorator;应用场景:
1、扩展一个类的功能。
2、动态增加功能,动态撤销。优点:
1、装饰者模式可以提供比继承更多的灵活性
2、装饰类和被装饰类可以独立发展,不会相互耦合
3、替代继承的强耦合关系,模块解耦缺点:
1、会产生很多的小对象,增加了系统的复杂性
2、多层装饰复杂度增加,意味着更加易于出错,排错也很困难,调试时寻找错误可能需要逐级排查,较为烦琐。
参考:
装饰器模式(Decorator)