本文共 2456 字,大约阅读时间需要 8 分钟。
装饰器模式,其实又叫做包装模式,其主要作用就是将附加的功能添加到别的类当中,让这个类实现其包含的类的方法,在具体的调用时,就会按照包装顺序进行调用。
提供一个统一接口,是装饰类和被装饰类的基础类
具体的实现类,对于接口当中的方式进行实现
继承了Componet接口,同时包含了一个Component接口对象,对于Component当中抽象方法的实现,调用的是,具体传递进来的componet方法,Decorator本身通过采用默认实现,他的存在仅仅是一个声明,只是为了生产出来一些用于装饰的子类,其子类才是具有装饰效果的类。
具体的装饰类,继承自Decorator,实现了decorator当中的方法,同时提供了自己的一些方法。
public interface Component { void doSomeThing();}
public class ConcreteComponent implements Component { @Override public void doSomeThing() { System.out.println("功能A"); }}
主要是对于装饰类Decorator,不做任何多余的方法处理,只是调用传递进来接口的方法
public class Decorator implements Component { private Component component; public Decorator(Component component){ this.component = component; } @Override public void doSomeThing() { component.doSomeThing(); }}
具体的装饰类实现
public class ConcreteDecorator extends Decorator { public ConcreteDecorator(Component component) { super(component); } @Override public void doSomeThing(){ super.doSomeThing(); this.doAnthorThing(); } public void doAnthorThing(){ System.out.println("功能B!"); }}
装饰类二
public class ConcreteDecorator1 extends Decorator { public ConcreteDecorator1(Component component) { super(component); } @Override public void doSomeThing() { super.doSomeThing(); this.doAnthorThing(); } public void doAnthorThing() { System.out.println("功能C"); }}
接下来我们来看下测试代码
public class Client { public static void main(String[] args)throws Exception { Component component = new ConcreteComponent(); component.doSomeThing(); System.out.println("------------------"); Component component1 = new ConcreteDecorator(new ConcreteComponent()); component1.doSomeThing(); System.out.println("------------------"); Component component2 = new ConcreteDecorator1(new ConcreteDecorator(new ConcreteComponent())); component2.doSomeThing(); }}执行结果功能A------------------功能A功能B!------------------功能A功能B!功能C
上述就是装饰器模式的一个大概实现我们对照来看下java IO包当中的实现
InputStream就是我们所说的Component角色对象,FileInputStream就是对应的一个ConcreteComponent角色,FilterInputStream就是我们所说的Decorator角色,继承了Component角色,同时持有了一个Component对象,FilterInputStream也正如我们所介绍的,其方法当中的实现,基本上都是调用传入进来的Component接口的实现,它本身并不做装饰性操作,主要是让其子类去实现装饰性的工作。而BufferedInputStream就是ConcreteDecorator角色,其中也是持有了Component对象的。
下面这篇文章具体讲述了为什么要使用装饰器模式,以及在自己的项目当中如何使用装饰器模式