1. 程式人生 > >23種設計模式(23):代理模式

23種設計模式(23):代理模式

public 附加 ade 調用 action new 參與 proxy inter

概述:

為其他對象提供一種代理以控制對這個對象的訪問。

類型:結構型模式。

類圖:

適用性:

1.遠程代理(RemoteProxy)為一個對象在不同的地址空間提供局部代表。

2.虛代理(VirtualProxy)根據需要創建開銷很大的對象。

3.保護代理(ProtectionProxy)控制對原始對象的訪問。

4.智能指引(SmartReference)取代了簡單的指針,它在訪問對象時執行一些附加操作。

參與者:

1.Proxy

保存一個引用使得代理可以訪問實體。若RealSubject和Subject的接口相同,Proxy會引用Subject。

提供一個與Subject的接口相同的接口,這樣代理就可以用來替代實體。

控制對實體的存取,並可能負責創建和刪除它。

其他功能依賴於代理的類型:

2.RemoteProxy負責對請求及其參數進行編碼,並向不同地址空間中的實體發送已編碼的請求。

3.VirtualProxy可以緩存實體的附加信息,以便延遲對它的訪問。

4.ProtectionProxy檢查調用者是否具有實現一個請求所必需的訪問權限。

5.Subject定義RealSubject和Proxy的共用接口,這樣就在任何使用RealSubject的地方都可以使用Proxy。

6.RealSubject定義Proxy所代表的實體。

例子:


Proxy 

public class ProxyObject implements Object {



    Object obj;



    public ProxyObject() {

        System.out.println("這是代理類");

        obj = new ObjectImpl();

    }



    public void action() {

        System.out.println("代理開始");

        obj.action();

        System.out.println("代理結束");

    }

}

Subject 

public interface Object {



    void action();

}

RealSubject 

public class ObjectImpl implements Object {



    public void action() {

        System.out.println("========");

        System.out.println("========");

        System.out.println("這是被代理的類");

        System.out.println("========");

        System.out.println("========");

    }

}

Test 

public class Test {



    public static void main() {

        Object obj = new ProxyObject();

        obj.action();

    }

}

result:


這是代理類

代理開始

========

========

這是被代理的類

========

========

代理結束

23種設計模式(23):代理模式