1. 程式人生 > >JDK設計模式之——裝飾者模式(適配器模式)

JDK設計模式之——裝飾者模式(適配器模式)

div rgs static eight 裝飾者 參數 decorator 裝飾器 方式

  • 假定已經有三個類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();
    }
}

可以看到 裝飾器設計模式簡化了類的繼承關系,並且提高代碼的可重用性

BufferedInputStream(InputStream in, int size)
創建具有指定緩沖區大小的 BufferedInputStream 並保存其參數,即輸入流 in,以便將來使用。

JDK中的BufferedInputStream就是InputStream的一個裝飾器

JDK設計模式之——裝飾者模式(適配器模式)