JDK设计模式之——装饰者模式
- 假定已经有三个类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(); } }
可以看到 装饰器设计模式简化了类的继承关系,并且提高代码的可重用性