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


動機(Motivation)

  • 在面向對象系統中,有些對象由於某種原因(比如對象創建的開銷很大,或者某些操作需要安全控制,或者需要進程外的訪問等), 直接訪問會給使用者、或者系統結構帶來很多麻煩。
  • 如何在不失去透明操作對象的同事來管理/控制這些對象特有的復雜性?增加一層間接層是軟件開發中常見的解決方式。

模式定義

為其他對象提供一種代理以控制(隔離,使用接口)對這對象的訪問。 ——《設計模式》GoF

結構(Structure)

要點總結

  • Proxy並不一定要求保持接口完整的一致性,只要能夠實現間接控制,有時候損及一些透明性是可以接受的。

基本代碼

#include <iostream>
using namespace std;

class Subject   // Subject類定義了RealSubject和Proxy的公用接口,這樣就在任何使用RealSubject的地方都可以用Proxy
{
public:
    virtual void Request() = 0;
    virtual ~Subject() {}
};

class RealSubject : public Subject   // RealSubject類,定義了Proxy所代表的真實實體
{
public:
    void Request()
    {
        cout << "RealSubject" << endl;
    }
};

class Proxy : public Subject   // Proxy類,保存一個引用使得代理可以訪問實體,並提供一個與Subject的接口相同的接口,這樣代理就可以用來代替實體
{
private:
    RealSubject* realSubject;
public:
    void Request()
    {
        if (realSubject == NULL)
            realSubject = new RealSubject();
        realSubject->Request();
    }
};

int main()
{
    Proxy* p = new Proxy();
    p->Request(); // RealSubject
    delete p;
    return 0;
}

應用場合

  1. 遠程代理,也就是為了一個對象在不同的地址空間提供局部代表,這樣可以隱藏一個對象存在於不同地址空間的事實。
  2. 虛擬代理,是根據需要創建開銷很大的對象,通過它來存放實例化需要很長時間的真實對象。
  3. 安全代理,用來控制真是對象的訪問權限。一般用於對象應該有不同的訪問權限的時候。
  4. 智能指引,是指當調用真實的對象時,代理處理另外一些事。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM