聽起來沒那麼好懂的樣子
代理模式的基本思路
代理模式就是給一個對象提供一個代理,並由代理對象控制對原對象的引用。它使得客戶不能直接與真正的目標對象通信。代理對象是目標對象的代表,其他需要與這個目標對象打交道的操作都是和這個代理對象在交涉。
o Subject: 抽象主題角色o Proxy: 代理主題角色o RealSubject: 真實主題角色
代理者可以在實現功能後,加上一些打印日誌等的功能。
舉個例子:
Subject:網絡請求接口
public interface IHttp { void request(String sendData); void onSuccess(String receivedData); }
RealSubject:網絡工具類
public class HttpUtil implements IHttp { @Override public void request(String sendData) { System.out.println("網絡請求中..."); } @Override public void onSuccess(String receivedData) { System.out.println("網絡請求完成。"); } }
Proxy:代理類
public class HttpProxy implements IHttp { private final HttpUtil httpUtil; public HttpProxy(HttpUtil httpUtil) { this.httpUtil = httpUtil; }//關鍵代碼,獲取要代理的對象 @Override public void request(String sendData) { System.out.println("發送數據:" + sendData); httpUtil.request(sendData); } @Override public void onSuccess(String receivedData) { System.out.println("收到數據:" + receivedData); httpUtil.onSuccess(receivedData); } }
客戶端做如下:
public class Client { @Test public void test() { HttpUtil httpUtil = new HttpUtil(); HttpProxy proxy = new HttpProxy(httpUtil); proxy.request("request data");//使用代理 proxy.onSuccess("received result"); } }
這就是代理模式的一個應用,除了 打印日誌,它還可以用來做權限管理。讀者看到這裏可能已經發現了,這個代理類看起來和裝飾模式的 FilterInputStream 一模一樣,但兩者的目的不同,裝飾模式是爲了 增強功能或添加功能,代理模式主要是爲了加以控制。
以上是靜態代理,
- 靜態代理,代理類需要自己編寫代碼寫成。
- 動態代理,代理類通過 Proxy.newInstance() 方法生成。
動態代理這部分有點難看懂的說。。。