如果想给一个对象增加功能怎么办?一般做法是继承这个父类生成一个子类,在父类的功能基础上进行扩展,这样虽然实现了增加功能的需求,但是如果这个类已定义为不能继承(如被sealed关键字修饰)就不能实现以上要求,而且过于复杂的继承关系不利于系统的扩展和维护,那么有没有类似的方法不利用继承就可以实现扩展对象的功能呢?
装饰者模式使用对象之间的关联关系取代继承关系,动态的给对象增加、删除职责,装饰着模式降低了系统的耦合度,实现了开闭原则。装饰者模式的定义如下:动态的给对象增加一些额外的职责,就扩展功能而言,装饰模式提供了一种比使用子类更加灵活的替代方案。
装饰模式的结构:
装饰模式包含四个角色:
1.component(抽象构件):声明构件和装饰类的公用接口。即给出一个抽象接口,已规范准备接收附加责任的对象
2.ConcreteComponent(具体构件):抽象构件类的子类。 它定义了基础行为, 但装饰类可以改变这些行为。
3.Decorator(抽象装饰类):抽象构件类的子类。 它定义了基础行为, 但装饰类可以改变这些行为。
4.ConcreteComponent(装饰类):抽象装饰类的子类,负责向构件添加新的职责,每一个都定义了新行为,既可以调用抽象装饰类的方法,也可以调用定义的新方法。
结构图: