首頁  >  文章  >  Java  >  Java中常用的一種代理設計模式—範例總結

Java中常用的一種代理設計模式—範例總結

php是最好的语言
php是最好的语言原創
2018-07-24 17:16:131997瀏覽

簡介:代理模式提供某一個物件一個代理對象,並由代理對象控制對原對象的參考和存取。可以對該物件存取前、存取後、發生異常等情況的處理。可理解為對類別增強的一種手段(繼承、裝飾、代理)。

、作用

  • 中介隔離作用:在某些情況下,一個客戶類別不想或不能直接引用一個委託對象,而代理類別物件可以在客戶類別和委託對象之間起到中介的作用,其特徵是代理類別和委託類別實作相同的介面。

  • 開閉原則,增加功能:代理類別除了是客戶類別和委託類別的中介之外,我們還可以透過為代理類別增加額外的功能來擴展委託類別的功能,這樣做我們只需要修改代理類別而不需要再修改委託類,符合程式碼設計的開閉原則。代理類主要負責為委託類預處理訊息、過濾訊息、把訊息轉發給委託類,以及事後傳回結果的處理等。代理類別本身並不真正實現服務,而是同過呼叫委託類別的相關方法,來提供特定的服務。真正的業務功能還是由委託類別來實現,但是可以在業務功能執行的前後加入一些公共的服務。例如我們想為專案加入快取、日誌這些功能,我們就可以使用代理類別來完成,而沒必要開啟已經封裝好的委託類別。

二、代理模式分類

  • 靜態代理是由程式創建或特定工具自動產生原始程式碼,在對其編譯。在程式運行之前,代理類別.class檔案就已經被建立了。

  • 動態代理程式是在程式運行時透過反射機制動態建立的。

三、程式碼實作

靜態代理程式

// 第一步,创建服务类接口

public interface BuyHouse {
    void buyHosue();
}


/**
 * 第二步,实现服务接口
 */
public class BuyHouseImpl implements BuyHouse {

    @Override
    public void buyHosue() {
        System.out.println("我要买房");
    }
}


/**
 * 第三步,创建代理类
 */
public class BuyHouseProxy implements BuyHouse {

    private BuyHouse buyHouse;

    public BuyHouseProxy(final BuyHouse buyHouse) {
        this.buyHouse = buyHouse;
    }

    @Override
    public void buyHosue() {
        System.out.println("买房前准备");
        buyHouse.buyHosue();
        System.out.println("买房后装修");
    }
}

/**
 * 第四步,编写实现类
 */
public class ProxyTest {
    public static void main(String[] args) {
        BuyHouse buyHouse = new BuyHouseImpl();
        buyHouse.buyHosue();
        BuyHouseProxy buyHouseProxy = new BuyHouseProxy(buyHouse);
        buyHouseProxy.buyHosue();
    }
}

動態代理

        在動態代理中我們不再需要再手動的創建代理類,我們只需要編寫一個動態處理器就可以了。真正的代理物件由JDK再運行時為我們動態的來創建。

/**
 * 第一步:编写动态处理器
 */
public class DynamicProxyHandler implements InvocationHandler {

    private Object object;

    public DynamicProxyHandler(final Object object) {
        this.object = object;
    }

    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        System.out.println("买房前准备");
        Object result = method.invoke(proxy, args);
        System.out.println("买房后装修");
        return result;
    }
}

/**
 * 第二步:编写测试类
 */
public class DynamicProxyTest {
    public static void main(String[] args) {
        BuyHouse buyHouse = new BuyHouseImpl();
        BuyHouse proxyBuyHouse = (BuyHouse) Proxy.newProxyInstance(BuyHouse.class.getClassLoader(), new
                Class[]{BuyHouse.class}, new DynamicProxyHandler(buyHouse));
        proxyBuyHouse.buyHosue();
    }
}

 相關推薦:

##Java常用設計模式詳解-工廠模式

Java設計模式之代理模式(Proxy模式)介紹

影片教學:設計模式#

以上是Java中常用的一種代理設計模式—範例總結的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn