目錄
- 問題
- 解決方案
- 結構
- 代碼
代理是一種結構型設計模式,讓你能夠提供對象的替代品或其占位符。代理控制著對于原對象的訪問,并允許在將請求提交給對象前后進行一些處理。
問題
為什么要控制對于某個對象的訪問呢? 舉個例子: 有這樣一個消耗大量系統資源的巨型對象,你只是偶爾需要使用它,并非總是需要。
你可以實現延遲初始化: 在實際有需要時再創建該對象。 對象的所有客戶端都要執行延遲初始代碼。 不幸的是, 這很可能會帶來很多重復代碼。
在理想情況下, 我們希望將代碼直接放入對象的類中, 但這并非總是能實現:比如類可能是第三方封閉庫的一部分。
解決方案
代理模式建議新建一個與原服務對象接口相同的代理類, 然后更新應用以將代理對象傳遞給所有原始對象客戶端。 代理類接收到客戶端請求后會創建實際的服務對象, 并將所有工作委派給它。
這有什么好處呢? 如果需要在類的主要業務邏輯前后執行一些工作, 你無需修改類就能完成這項工作。 由于代理實現的接口與原類相同, 因此你可將其傳遞給任何一個使用實際服務對象的客戶端。
結構
代碼
#include <iostream>
#include <memory>
using namespace std;class ServiceInterface{
public:virtual void operation()=0;virtual ~ServiceInterface(){}
};
class Service:public ServiceInterface{
public:void operation(){cout<<"真實服務的操作 \n";}
};
class Proxy:public ServiceInterface{
public:Proxy(shared_ptr<Service> realService):m_realService(realService){}bool checkAcess(){cout<<"檢查訪問權限 \n";return true;}void operation(){if(checkAcess()){m_realService->operation();}}
private:shared_ptr<Service> m_realService;
};int main(){auto realService=make_shared<Service>();cout<<"---真實服務操作"<<endl;realService->operation();auto proxy=make_shared<Proxy>(realService);cout<<"---代理服務操作"<<endl;proxy->operation();return 0;
}