九、装饰器模式Decorator(结构型)

来源:互联网 发布:倒带和彩虹歌词知乎 编辑:程序博客网 时间:2024/05/18 00:25

装饰器模式可以动态地给一个对象添加一些额外的职责。就添加功能来说,既可以通过生成子类的方式添加,也可以使用装饰器模式添加,但是使用装饰器模式时更加灵活。通过装饰器模式,可以将组件嵌入另外一个对象,然后使用这个对象增强原对象的功能,从而达到装饰的目的。


public interface Component {public void operation();}public class ConcreteComponent implements Component{@Overridepublic void operation() {System.out.println("Do my original job!");}}public class Decorator implements Component{protected Component component = null;public Decorator(Component component){this.component = component;}@Overridepublic void operation() {component.operation();}}public class ConcreteDecoratorA extends Decorator{private String addedState = null;public ConcreteDecoratorA(Component component) {super(component);addedState = "Initialed";}public void operation(){super.operation();System.out.println(String.format("Also change state! From %s to Operated.", addedState));addedState = "Operated";}}public class ConcreteDecoratorB extends Decorator{public ConcreteDecoratorB(Component component) {super(component);}public void operation(){super.operation();addedBehavior();}private void addedBehavior(){System.out.println("Another behavior added!");}}public class Client {@Testpublic void test(){Component comp1 = new ConcreteComponent();//AComponent decA = new ConcreteDecoratorA(comp1);//BComponent decB = new ConcreteDecoratorB(decA);decB.operation();}}

Component作为通用组件的接口,表示统一的对外接口,ConcreteDecorator是实现基础功能的类,Decorator提供装饰器的基类,它内部提供Component类型的引用,将来子类可以为这个Component添加新的装饰,ConcreteDecoratorA为基础的ConcreteComponent添加addedState状态,而ConcreteDecoratorB为基础的ConcreteComponent添加了AddedBehavior()方法,用来添加额外的特性。

装饰器模式可以在不影响其他对象的情况下,动态、透明的方式给单个对象添加职责,而且可以处理那些可以撤销的职责,使用装饰器模式也比单纯的继承要好很多,因为装饰器可以在运行时动态的增加删除职责(通过将不同的装饰器实现交给Client来达到动态性),而且装饰器模式还可以避免层次结构的高层有太多特征,通过将这些特征分散到不同的装饰器中,并组合这些特征就能达到多种多样的效果。

装饰器模式有一个比较大的缺点就是会产生大量的小对象,而且它们会很相似,这些小对象都包含着一些原有的基础对象之外的功能,是对原对象的功能拓展。对于了解这些系统的人来说,定制这些功能会比较容易,但是学习起来相对困难。Java中的IO系统就是使用装饰器模式的很好的例子。

从组合上来看,Decorator和Adapter很相似,但是它们的目的不同,Decorator是在不影响接口的基础上为原接口的实现类添加新的功能,而Adapter的目的是为了将Adaptee对象转化为Target接口类型的对象,中间牵扯到接口类型的转变。

0 0
原创粉丝点击