C++設計模式-Proxy代理模式

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 }
相關文章
相關標籤/搜索