装饰模式的定义
*装饰(Decorator)模式: * 指在不改变现有对象结构的情况下,动态的给该对象增加一些职责(即增加额外功能)的模式,它属于对象结构型模式
特点
- *优点: *
- 采用装饰模式扩展对象的功能比采用继承方式更加灵活
- 可以设计出多个不同的具体装饰类,创造出多个不同行为的组合(Java IO即采用装饰模式)
- *缺点: *
- 装饰模式增加了许多子类,如果过度使用会使程序变得很复杂
模式的结构与实现
通过组合关系来包装对象,达到扩展对象功能的目的,同时实现统一接口,可以传入同类型对象达到互相装饰效果
模式的结构
抽象构件(Component)角色:定义一个抽象接口以规范准备接收附加责任的对象
具体构件(Concrete Component)角色:实现抽象构件,通过装饰角色为其添加一些职责
抽象装饰(Decorator)角色:继承抽象构件,并包含具体构件的实例,可以通过其子类扩展具体构件的功能
具体装饰(ConcreteDecorator)角色:实现抽象装饰的相关方法,并给具体构件对象添加附加的责任
模式的实现
/** * 装饰模式 * 通俗说就是使用组合将对象传入,然后进行扩展, * 同时实现统一的接口,传入对象类型为接口类型,可以使具体构件达到互相装饰的效果 */ //抽象构件角色: 统一接口 interface Component{ void operation(); } //具体构件角色 class ConcreteComponent implements Component{ public ConcreteComponent() { System.out.println("创建具体构件角色"); } @Override public void operation() { System.out.println("调用具体构件角色的方法operation()"); } } //抽象装饰角色 class Decorator implements Component{ private Component component; //使用组合传入具体构件 public Decorator(Component component) { this.component = component; } @Override public void operation() { component.operation(); //调用具体构件的方法 } } //具体装饰角色 class ConcreteDecorator extends Decorator{ public ConcreteDecorator(Component component) { super(component); } @Override public void operation() { super.operation(); addedFunction(); //增加额外功能 } public void addedFunction(){ System.out.println("为具体构件角色增加额外的功能addedFunction()"); } } //测试 public class DecoratorPattern { public static void main(String[] args) { Component p = new ConcreteComponent(); p.operation(); System.out.println("-----------------"); Component d = new ConcreteDecorator(p); d.operation(); } }