设计模式十三:proxy(代理)——对象结构型模式
proxy(代理)——對象結構型模式
?
1.意圖
為其他對象提供一種代理以控制這個對象的訪問
?
2.動機
對一個對象進行訪問控制的一個原因是為了只有在我們確實需要這個對象時才對它進行創建和初始化。
?
3.適用性
在需要用比較通用和復雜的對象指針代替簡單的指針的時候,使用proxy模式
1)遠程代理
為一個對象在不同的地址空間提供局部代表
2)虛代理
根據需要創建開銷很大的對象
3)保護代理
控制對原始對象的訪問。保護代理用于對象應該有不同的訪問權限的時候。
4)智能指引
取代了簡單指針,在訪問對象的時候執行一些附加的操作
?
4.結構
參考:http://www.cnblogs.com/rush/archive/2011/06/19/2084775.html?
?
?
5.參與者
proxy
保存一個引用使得代理可以訪問實體
提供一個subject的接口相同的接口,這樣代理可以用來替代實體
控制對實體的存取,并可能負責創建和刪除他
其他功能依賴于代理的類型:
??? 遠程代理負責對請求及其參數編碼,并向不同地址空間中的實體發送已編碼的請求
??? 虛代理可以緩存實體的附加信息,一邊延遲對它的訪問
??? 保護代理可以檢查調用者是否具有實現一個請求所必須的訪問權限。
subject
定義realSubject和Proxy的公用接口,這樣就可以在任何使用realSubject的地方使用proxy
realSubject
定義proxy所代表的實體
?
?
6.協作
flyweight執行時所需的狀態必定是內部的或者是外部的,內部狀態存儲于concreteflyweight對象之中,而外部對象則由client對象存儲,當用戶調用flyweight對象的操作時,將該狀態傳遞給他。
用戶不應該直接對concreteflyweight類進行實例化,二十只能從flyweightFactory對象得到concreteflyweight對象,這保證對他們適當的進行共享。
?
7.效果
在訪問對象的時候引入了一定的間接性,根據代理類型不同而不同
??? 遠程代理可以隱藏一個對象存在于不同地址空間的事實
??? 虛代理可以進行最優化
??? 保護代理可以允許訪問一個對象時有一些附加的內務處理
?
8.實現
重載c++中的存取運算符
重載->使你可以在撤銷對一個對象的引用時,執行一些附加的操作。這一點可以實現某些種類的代理,代理的作用就像指針。
?
9.代碼示例
#include<iostream> using namespace std;class subject {public:virtual void dosth(){} };class realSubject:public subject {public:realSubject(string str){name = str;}void dosth(){for(int i=0;i<10;i++){cout<<"waiting "<<i<<" seconds....."<<endl; }cout<<getName()<<endl;}string getName(){return name;}private:string name; };class proxy:public subject {public:proxy(realSubject *r){rsub = r;}void dosth(){cout<<rsub->getName()<<endl;}private:realSubject *rsub; };int main() {realSubject *r = new realSubject("a subject farrrrrrr away");cout<<"without proxy"<<endl;r->dosth();cout<<endl<<"with proxy"<<endl;proxy *p = new proxy(r);p->dosth(); }?
?
10.相關模式
adapter:為他所適配的對象提供了一個不同的接口,相反,代理提供了和實體相同的接口。實際上應該只是實體接口的一個子集,因為有些操作會被拒絕。
decorator:為了增加一些功能,而代理是為了控制對象的訪問。
?
?
轉載于:https://www.cnblogs.com/w0w0/archive/2012/05/20/2510193.html
總結
以上是生活随笔為你收集整理的设计模式十三:proxy(代理)——对象结构型模式的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【DEMO 0074】进程创建与消亡
- 下一篇: Http Get 和 Post