1. 程式人生 > >JAVA設計模式--動態代理模式

JAVA設計模式--動態代理模式

今天看了一下設計模式,下面我對這方面做個學習總結:

以小車做個例項:首先定義了一個定義了一個Moveable的介面,內的方法為move()方法;讓小車繼承Moveable介面,實現move方法,並寫了一些簡單邏輯

public void move() {
        long start =System.CurrentTimeMillis();
        System.out.println("Tank Moving...");
        try {
            Thread.sleep(new Random().nextInt(10000));
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

        long end = System.currentTimeMillis();

        System.out.println(“time:”+(end-start));
    }

在這個例項,記錄了小車執行時間。

提出問題:如何對該類進行日誌檢查、檢查方法執行時間的等等操作。

則需要新增一個實現Moveable的介面一個類,對其擴充套件業務邏輯,不要使用繼承,因為以後擴充套件太不靈活,在進行邏輯操作,會導致類的繁瑣,所以使用聚合,達到高內聚,低耦合;

所以如果對其任意實現Moveable介面來擴充套件其功能,可以使用構造方法傳值的方法、即所謂的內聚。

那麼這個實現Moveable介面的類就叫做代理類,那麼問題出現瞭如何為這個物件提供不同的邏輯處理那?

那麼可以自己寫一個總代理,為了理解不用JV,M的proxy,直接寫一個newProxyInstance()方法返回Object物件,內部可以模擬JVM動態載入某個實現PROXY介面的子類,

所以可以再測試類中可以寫建立一個小車物件、定義Movable m =(Movable)Proxy.newProxyInstance(小車物件); m.move();

就此實現了同一個物件有不同的邏輯處理

那麼又有一個問題那麼有這樣一個代理類可以為任意一個物件代理哪,答案就是傳入一class型別的介面,內部細節就不敘述了,實現的時候就可以以Movable m=(Moveable)Proxy.newProxyInstance(Movable.CLASS);

但是這樣還不行每一個介面內的方法不是一樣,那麼就用到反射的技術,在proxy類裡可以動態的建立class物件來獲取方法

當然以上的流程都被JDK封裝了,寫這個就是為了更深入的理解代理的概念