装饰者模式
顾名思义,装饰模式就是给一个对象增加一些新的功能,而且是动态的,通俗一点就是我们现在突然需要给某个已经打包好的类的方法进行增强,不能修改原有的代码,此时我们就可以使用装饰者模式,要求装饰对象和被装饰对象实现同一个接口,装饰对象持有被装饰对象的实例
类型:
结构型模式
装饰者模式的三个对象:
- 被装饰类(Source)
- 被装饰类实现的接口(Component)
- 装饰者类(Decorator)
装饰者模式关系图:
装饰者模式示例:
被装饰者实现的接口:
/**
* Create by zhaihongwei on 2018/3/16
*/
public interface Component {
void method();
}
被装饰者类:
/**
* Create by zhaihongwei on 2018/3/16
*/
public class Source implements Component {
@Override
public void method() {
System.out.println("Source 实现的一些功能!");
}
}
装饰者类:
/**
* Create by zhaihongwei on 2018/3/16
* 装饰者类
*/
public class Decorator implements Component{
private Component component;
public Decorator(Component component) {
super();
this.component = component;
}
@Override
public void method() {
System.out.println("需要Source的功能!");
component.method();
System.out.println("这里还有一些别的功能!");
}
}
测试类:
/**
* Create by zhaihongwei on 2018/3/16
*/
public class DecoratorTest {
public static void main(String[] args) {
Component source = new Source();
Component decorator = new Decorator(source);
decorator.method();
}
}
装饰者模式优缺点:
优点
- 把类中的装饰功能从类中搬除,可以简化原来的类
- 可以把类的 核心职责和装饰功能区分开来,结构清晰 明了并且可以去除相关类的重复的装饰逻辑。
缺点:
- 如果一个类中有很多方法,使用装饰者模式实现共同的接口就需要一一实现这个接口中的所有方法,而往往很多方法是我们不需要进行增强,这样就产生很多多余的方法要一一调用原类的方法
装饰者模式最好体现:
java中对装饰者模式的最好的体现应该是:对于输入流和输出流进行装饰的一些类
个人感想:
因为之前学了适配器模式中的类适配器模式,总感觉类的适配器模式和装饰者模式很相似,想来想去,可能就是主要关注点不同吧,适配器模式主要关注的是接口的转换,而装饰者模式主要关注的是通过装饰者来动态的为被装饰者注入新的功能。
这是我自己的感觉,还在摸索中,希望了解的大佬可以给留言讲解一下。