装饰模式
这是一种比较常见的模式,定义如下:动态的给一个对象添加一些额外的职责,就增加功能来说,装饰模式比生成子类更加灵活。
装饰模式有四个基本角色:
- Component抽象构件
Component是一个接口或者是抽象类,就是定义最核心的对象,也就是最原始的对象。
- ConcreateComponent具体构件
ConcreateComponent是最原始的、最核心的、最基本的接口或抽象类的实现,也是我们需要装饰的对象。
- Decorator装饰角色
这一般是一个抽象类,用来干什么呢?定义装饰角色的抽象方法,在属性中必然有一个指向Component抽象构件的的private变量。
- 具体装饰角色
用于把最原始、最核心、最基本的东西装饰为其他东西。
下面看一段通用示例代码:
//抽象构件 public abstract class Component{ public abstract void operate(); } //具体构件 public class ConcreateComponent extends Component{ @Override public void operate(){ } } //抽象装饰者 public abstract class Decorator extends Component{ private Component component = null; //通过构造函数传递被修饰者 public Decorator(Component component){ this.component = component; } //委托给被修饰者执行 public void operate(){ this.component.operate(); } } //具体的装饰类 public class ConcreateDecorator1 extends Decorator{ //定义被修饰者 public ConcreateDecorator1(Component component){ super(component); } //定义自己的修饰方法 priate void method1(){ } //重写父类方法 public void operate(){ this.method1(); super.operate(); } } public class ConcreateDecorator2 extends Decorator{ //定义被修饰者 public ConcreateDecorator2(Component component){ super(component); } //定义自己的修饰方法 private void method2(){ } //重写父类方法 public void operate(){ this.method2(); super.operate(); } }
需要注意的是,原始方法和装饰方法的执行顺序在具体的装饰类中是固定的,但可以通过重载实现多种顺序的组合。
装饰模式优点:
- 装饰类和被装饰类可以独立发展,而不会相互耦合
- 装饰模式是继承关系的一个替代方案,不管装饰多少层,返回的还是原始组件的实现方法,实现的是is-a关系
- 可以动态扩展一个实现类的功能,这也是它的定义
装饰模式缺点:
- 多层装饰将会比较复杂,难以调试和发现问题,尽量减少装饰类的数量,降低系统复杂度。
装饰模式场景:
- 需要动态扩展一个类的功能,或给一个类增加附加功能
- 可以动态增加或修改一些功能,可以动态撤销