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();
    }
}

可以看到 装饰器设计模式简化了类的继承关系,并且提高代码的可重用性

posted @ 2018-07-12 20:24  palapala  阅读(215)  评论(0编辑  收藏  举报