Proxy代理模式ios
做用:爲其餘對象提供一種代理以控制對這個對象的訪問。this
代理的種類:spa
若是按照使用目的來劃分,代理有如下幾種:代理
遠程(Remote)代理:爲一個位於不一樣的地址空間的對象提供一個局域表明對象。這個不一樣的地址空間能夠是在本機器中,也但是在另外一臺機器中。遠程代理又叫作大使(Ambassador)。 也就是爲一個對象在不一樣的地址空間提供局部表明。這樣能夠隱藏一個對象存在於不一樣地址空間的事實。code
虛擬(Virtual)代理:根據須要建立一個資源消耗較大的對象,使得此對象只在須要時纔會被真正建立。是根據須要建立開銷很大的對象。經過它來存放實例化須要很長時間的真實對象。 對象
Copy-on-Write代理:虛擬代理的一種。把複製(克隆)拖延到只有在客戶端須要時,才真正採起行動。blog
保護(Protect or Access)代理:控制對一個對象的訪問,若是須要,能夠給不一樣的用戶提供不一樣級別的使用權限。 用來控制真實對象訪問時的權限。通常用於對象應該有不一樣的訪問權限的時候。接口
Cache代理:爲某一個目標操做的結果提供臨時的存儲空間,以便多個客戶端能夠共享這些結果。 防火牆(Firewall)代理:保護目標,不讓惡意用戶接近。 同步化(Synchronization)代理:使幾個用戶可以同時使用一個對象而沒有衝突。內存
智能引用(Smart Reference)代理:當一個對象被引用時,提供一些額外的操做,好比將對此對象調用的次數記錄下來等。 是指當調用真實的對象時,代理處理另一些事。如計算真實對象的引用次數,這樣當該對象沒有引用時,能夠自動釋放它;或當第一次引用一個持久對象時,將它裝入內存;或在訪問一個實際對象前,檢查是否已經鎖定它,以確保其餘對象不能改變它。它們都是經過代理在訪問一個對象時附加一些內務處理。資源
在全部種類的代理模式中,虛擬(Virtual)代理、遠程(Remote)代理、智能引用代理(Smart Reference Proxy)和保護(Protect or Access)代理是最爲常見的代理模式。
UML圖:
Subject:聲明瞭真實主題和代理主題的共同接口,這樣一來在任何使用真實主題的地方均可以使用代理主題。
Proxy:代理主題角色內部含有對真是主題的引用,從而能夠在任什麼時候候操做真實主題對象;代理主題角色提供一個與真實主題角色相同的接口,以即可以在任什麼時候候均可以替代真實主體;控制真實主題的應用,負責在須要的時候建立真實主題對象(和刪除真實主題對象);代理角色一般在將客戶端調用傳遞給真實的主題以前或以後,都要執行某個操做,而不是單純的將調用傳遞給真實主題對象。
ConcreteSubject:定義了代理角色所表明的真實對象。
代碼以下:
Proxy.h
1 #ifndef _PROXY_H_ 2 #define _PROXY_H_ 3 4 // 定義了Proxy和ConcreteSubject的公有接口, 5 // 這樣就能夠在任何須要使用到ConcreteSubject的地方都使用Proxy. 6 class Subject 7 { 8 public: 9 virtual ~Subject(); 10 virtual void Request()=0; 11 protected: 12 Subject(); 13 }; 14 15 class ConcreteSubject : public Subject 16 { 17 public: 18 ConcreteSubject(); 19 ~ConcreteSubject(); 20 virtual void Request(); 21 }; 22 23 //定義代理類 24 class Proxy : public Subject 25 { 26 public: 27 Proxy(); 28 ~Proxy(); 29 void DoSomething1(); 30 virtual void Request(); 31 void DoSomething2(); 32 private: 33 Subject* _subject; 34 }; 35 #endif
Proxy.cpp
1 #include "Proxy.h" 2 #include "iostream" 3 4 using namespace std; 5 6 Subject::Subject() 7 {} 8 9 Subject::~Subject() 10 {} 11 12 ConcreteSubject::ConcreteSubject() 13 {} 14 15 ConcreteSubject::~ConcreteSubject() 16 {} 17 18 void ConcreteSubject::Request() 19 { 20 cout << "ConcreteSubject::Request" << endl; 21 } 22 23 Proxy::Proxy() : _subject(NULL) 24 {} 25 26 Proxy::~Proxy() 27 {} 28 29 void Proxy::DoSomething1() 30 { 31 cout << "Proxy::DoSomething1" << endl; 32 } 33 34 void Proxy::DoSomething2() 35 { 36 cout << "Proxy::DoSomething2" << endl; 37 } 38 39 void Proxy::Request() 40 { 41 if(NULL == this->_subject) 42 { 43 this->_subject = new ConcreteSubject(); 44 } 45 46 this->DoSomething1();//表示額外附加的操做 47 48 this->_subject->Request();//代理的實體類操做 49 50 this->DoSomething2();//表示額外附加的操做 51 }
Main.cpp
1 #include "Proxy.h" 2 3 int main() 4 { 5 Proxy* proxy = new Proxy(); 6 proxy->Request(); 7 8 return 0; 9 }