代理模式——爲其餘對象提供一種代理以控制對這個對象的訪問。 在某些狀況下,一個對象不適合或者不能直接引用另外一個對象,而代理對象能夠在客戶端和目標對象之間起到中介的做用。ios
解決的問題場景: 在直接訪問對象時會帶來問題,有些對象因爲某些緣由(對象建立開銷很大,或者某些操做須要安全控制,或者須要進程外的訪問),直接訪問會給使用者或者系統結構帶來不少麻煩,咱們能夠在訪問此對象時加上一個對此對象的訪問層(好比說只能訪問某些接口,其餘接口不可訪問,據此能夠抽象出一個接口),從而實現了邏輯和實現的完全解耦。編程
優勢:設計模式
代理模式的組成:安全
模式結構:
一個是真正的你要訪問的對象(目標類),一個是代理對象,真正對象與代理對象實現同一個接口,先訪問代理類再訪問真正要訪問的對象。spa
具體實現上,其實就是先定義抽象類,把代理須要的接口定義好,而後實現代理類,實現抽象類定義的接口,具體的工做仍交由真實角色完成,代理角色只是實現了一層包裝。代理是輕量級的,僅僅實現代理的功能。設計
#include<iostream> using namespace std; //抽象類 class Subject { public: Subject(){} virtual ~Subject(){} //抽象角色:經過接口或抽象類聲明真實角色實現的業務方法。 virtual void Request()=0;//接口 }; //委託類 class ConcreteSubject:public Subject { public: ConcreteSubject(){} ~ ConcreteSubject(){} //真實角色:實現抽象角色,定義真實角色所要實現的業務邏輯,供代理角色調用。 void Request() { cout<<"代理實現請求!"<<endl; } }; //代理類 class Proxy { public: Proxy():_sub(NULL){} Proxy(Subject* sub):_sub(sub){} ~Proxy(){ if(_sub!=NULL){ delete _sub; } } //代理角色:實現抽象角色,是真實角色的代理, void Request() { _sub->Request(); //經過真實角色的業務邏輯方法來實現抽象方法,並能夠附加本身的操做。 } private: Subject* _sub; }; int main() { //代理模式的最大好處就是實現了邏輯和實現的完全解耦 Subject* sub = new ConcreteSubject(); Proxy* p = new Proxy(sub); p->Request();//p的Request請求其實是交給了sub來實際執行 return 0; }