JDK设计模式之——装饰者模式
2018-07-12 20:24
399 查看
- 假定已经有三个类A,B和C他们的继承关系如下
ClassA | |
Class B extends A | Class C extends A |
想进一步扩展类B和类C的功能,新增三个方法 method1()、 method2()、 method3()。
要求 类B和类C 满足 可能新增一个方法,两个方法,或者三个方法
- 用继承扩展(缺点很大)
解决办法,用继承关系 给B写7个子类(3个方法的排列组合 2的三次方-1) 给A也写三个子类。
采用继承的方式扩展B类和C类的功能,会导致子类的数目急剧增加,而且存在重复代码。
- 装饰者设计模式
在这种设计模式中,把需要扩展的功能(method1()、method2()、method3())放在装饰类中,装饰器类继承A、因此拥有类A的接口。在装饰器中还包含了一个类A的实例
因此:装饰器不仅拥有类A实例的功能,并且还能扩展类A实例的功能
下面定义三个装饰器类 Decorator1 Decorator2 Decorator3,他们分别提供一种新增的功能分别是 method1()、method2()、method3()
public class Decorator1 extends A{ protected A a; public Decorator1(A a){ this.a=a; } public void method1(){ System.out.println("我是方法1"); } }
public class Decorator2 extends A{ protected A a; public Decorator2(A a){ this.a=a; } public void method2(){ System.out.println("我是方法2"); } }
public class Decorator3 extends A{ protected A a; public Decorator3(A a){ this.a=a; } public void method3(){ System.out.println("我是方法3"); } }
在下面程序中对类B类进行了装饰,使它们具有method1()和method2()的功能 这样可以很灵活的满足需求
public class Test { public static void main(String[] args) { A a = new B(); Decorator1 d1= new Decorator1(a); d1.method1(); Decorator2 d2= new Decorator2(a); d2.method2(); } }
可以看到 装饰器设计模式简化了类的继承关系,并且提高代码的可重用性
装饰者设计模式,和动态代理的设计模式,有一定的相似性,从概念层面不太好区分。
从应用层面:动态代理的用途主要是AOP面向切面(给类的方法执行前后 都加一点逻辑)
装饰者主要是对类进行功能的扩展。
BufferedInputStream
(InputStream in, int size)
创建具有指定缓冲区大小的
BufferedInputStream并保存其参数,即输入流
in,以便将来使用。
BufferedInputStream为另一个输入流添加一些功能,即缓冲输入以及支持
mark和
reset方法的能力 BufferedInputStream就是InputStream的一个装饰器
相关文章推荐
- JDK中的设计模式之装饰者模式
- JDK里的设计模式
- Java——设计模式——装饰者模式
- 设计模式 — 结构型模式 装饰者模式
- PHP设计模式之装饰者模式
- (Head First 设计模式)学习笔记(3) --装饰者模式(StarBuzz咖啡店实例)
- 设计模式:装饰者模式
- 设计模式->结构型模式->装饰者模式
- 设计模式——代理模式介绍及与装饰者模式的区别
- 《Head First 设计模式》学习笔记——观察者模式 + 装饰者模式
- JDK中的设计模式应用实例
- 设计模式之装饰者模式
- Java设计模式之装饰者模式
- [知了堂学习笔记]设计模式之装饰者模式
- 设计模式(三)--装饰者模式(1)
- JAVA设计模式——装饰者模式
- 设计模式(十一)装饰者模式(Decorator)-结构型
- .NET简谈设计模式之(装饰者模式性能问题?)
- 白话设计模式 --结构型模式--装饰者(Decorator)模式,适配器模式和外观模式
- 设计模式第三课:装饰者模式(deco…