簡介:代理模式提供某一個物件一個代理對象,並由代理對象控制對原對象的參考和存取。可以對該物件存取前、存取後、發生異常等情況的處理。可理解為對類別增強的一種手段(繼承、裝飾、代理)。
一、作用
中介隔離作用:在某些情況下,一個客戶類別不想或不能直接引用一個委託對象,而代理類別物件可以在客戶類別和委託對象之間起到中介的作用,其特徵是代理類別和委託類別實作相同的介面。
開閉原則,增加功能:代理類別除了是客戶類別和委託類別的中介之外,我們還可以透過為代理類別增加額外的功能來擴展委託類別的功能,這樣做我們只需要修改代理類別而不需要再修改委託類,符合程式碼設計的開閉原則。代理類主要負責為委託類預處理訊息、過濾訊息、把訊息轉發給委託類,以及事後傳回結果的處理等。代理類別本身並不真正實現服務,而是同過呼叫委託類別的相關方法,來提供特定的服務。真正的業務功能還是由委託類別來實現,但是可以在業務功能執行的前後加入一些公共的服務。例如我們想為專案加入快取、日誌這些功能,我們就可以使用代理類別來完成,而沒必要開啟已經封裝好的委託類別。
二、代理模式分類
靜態代理是由程式創建或特定工具自動產生原始程式碼,在對其編譯。在程式運行之前,代理類別.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中常用的一種代理設計模式—範例總結的詳細內容。更多資訊請關注PHP中文網其他相關文章!