目錄
1. 代理模式簡介
2. 代碼示例
1. 代理模式簡介
代理模式是一種行為型模式。
代理模式的定義:由于某些原因需要給某對象提供一個代理以控制該對象的訪問。這時,訪問對象不適合或者不能直接訪問引用目標對象,代理對象作為訪問對象和目標對象之間的中介,代理模式也叫做委托模式。
代理模式實際上作為一個中間層,處于要操作的目標對象和客戶代碼之間的中間層。相當于一個中介。
代理模式涉及到的角色主要有三個:
- 抽象主題(抽象接口類):通過接口類聲明真實主題的業務接口。
- 真實主題(業務實現類):實現了具體的業務,是代理對象所引用的真實對象。
- 代理類:提供了和真實主題相同的接口,并引用了一個真實主題對象,可以調用具體的業務接口,訪問真實主題的功能。
UML類圖如下所示:
以租房為例,房屋中介就相當于代理對象,房東就相當于真實主題。客戶只需要和中介打交道即可。
代理對象并不真正實現服務,而是通過調用引用的真實對象的相應接口來提供服務,真正的業務還是由真實主題來完成。
代理對象的目的在于執行具體業務的前后加入一些其他的操作,比如權限控制、緩存、日志記錄等功能。
這樣真實的業務類就可以專注于業務的實現,其他的限制操作在代理類中實現。
代理模式的關鍵就在于代理類和真實主題類繼承自相同的接口,并且代理模式引用一個真實的主題對象。
2. 代碼示例
這里我們模擬一個計算器的程序,代理類將限制計算器的使用次數,超過使用次數上限將限制訪問。
#if 1#include <iostream>using namespace std;class Subject
{
public:virtual int add(int a, int b) = 0;virtual int sub(int a, int b) = 0;
};class RealSubject : public Subject
{
public:int add(int a, int b){return a + b;}int sub(int a, int b){return a - b;}
};class Proxy : public Subject
{
private:RealSubject* m_realSubject;unsigned int m_count;
public:Proxy(RealSubject* realSubject, unsigned int count = 3){m_realSubject = realSubject;m_count = count;}int add(int a, int b){if (m_count == 0){cout << "剩余訪問次數為0,無法訪問" << endl;return 0;}else{m_count--;cout << "剩余訪問次數:" << m_count << endl;return m_realSubject->add(a, b);}}int sub(int a, int b){if (m_count == 0){cout << "剩余訪問次數為0,無法訪問" << endl;return 0;}else{m_count--;cout << "剩余訪問次數:" << m_count << endl;return m_realSubject->sub(a, b);}}};int main()
{RealSubject realSubject;Proxy proxy(&realSubject);cout << proxy.add(10, 5) << endl;cout << proxy.sub(10, 5) << endl;cout << proxy.add(10, 5) << endl;cout << proxy.sub(10, 5) << endl;cout << proxy.add(10, 5) << endl;return 0;
}#endif
運行結果如下圖所示:
?