設計模式:結構型->代理模式

結構型模式是用來設計程序的結構的。結構型模式就像搭積木,將不同的類結合在一起形成契合的結構。

聽起來沒那麼好懂的樣子

 

代理模式的基本思路

代理模式就是給一個對象提供一個代理,並由代理對象控制對原對象的引用。它使得客戶不能直接與真正的目標對象通信。代理對象是目標對象的代表,其他需要與這個目標對象打交道的操作都是和這個代理對象在交涉

 

 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 一模一樣,但兩者的目的不同,裝飾模式是爲了 增強功能或添加功能,代理模式主要是爲了加以控制。

 

以上是靜態代理,

  1. 靜態代理,代理類需要自己編寫代碼寫成。
  2. 動態代理,代理類通過 Proxy.newInstance() 方法生成。

 

動態代理這部分有點難看懂的說。。。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章