代理模式(Proxy Pattern)

代理模式——爲其餘對象提供一種代理以控制對這個對象的訪問。 在某些狀況下,一個對象不適合或者不能直接引用另外一個對象,而代理對象能夠在客戶端和目標對象之間起到中介的做用。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;
}
相關文章
相關標籤/搜索