首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> C++ >> 關於C++

設計模式實作系列(十):Proxy 代理模式 - 控制對真實物件的存取與延遲初始化

     編輯:關於C++

模式意圖

為其他物件提供一種代理以控制對這個物件的存取。

UML 結構圖

Proxy Pattern UML

核心解析:虛擬代理

本實作展示 虛擬代理:真實物件(RealSubject)建構昂貴(如大圖片載入、資料庫連線),代理(Proxy)持有指標,僅在首次呼叫 Request() 時才建立真實物件(延遲初始化)。

  • Subject: 共同介面,確保代理可透明替換真實物件。
  • Proxy: 控制存取、記錄日誌、權限檢查、快取、遠端代理(RPC)等。
  • 關鍵: Proxy 與 RealSubject 共同繼承 Subject,介面一致。

C++ 完整實作

1. Proxy.h

#ifndef PROXY_H
#define PROXY_H

class Subject {
public:
    Subject() {}
    virtual ~Subject() {}
    virtual void Request() = 0;
};

class RealSubject : public Subject {
public:
    RealSubject();
    virtual ~RealSubject() {}
    virtual void Request();
};

class Proxy : public Subject {
public:
    Proxy();
    virtual ~Proxy();
    virtual void Request();
private:
    RealSubject* m_pRealSubject;
};

#endif

2. Proxy.cpp

#include "Proxy.h"
#include <iostream>

RealSubject::RealSubject() { std::cout << "Constructing a RealSubject\n"; }
void RealSubject::Request() { std::cout << "Request By RealSubject\n"; }

Proxy::Proxy() : m_pRealSubject(nullptr) { std::cout << "Constructing a Proxy\n"; }
Proxy::~Proxy() { delete m_pRealSubject; m_pRealSubject = nullptr; }

void Proxy::Request() {
    if (!m_pRealSubject) {
        std::cout << "Request By Proxy\n";
        m_pRealSubject = new RealSubject(); // 延遲建構
    }
    m_pRealSubject->Request();
}

3. Main.cpp

#include "Proxy.h"
#include <cstdlib>

int main() {
    Subject* pProxy = new Proxy();
    pProxy->Request(); // 首次呼叫觸發 RealSubject 建構
    pProxy->Request(); // 後續直接委派
    delete pProxy;
    return 0;
}

代理模式常見變體

變體用途關鍵點
虛擬代理延遲建構昂貴物件首次使用時才建立 RealSubject
保護代理權限控制檢查呼叫者權限再決定是否轉發
遠端代理RPC/分散式系統封裝網路通訊細節(Stub/Skeleton)
智慧指標代理參考計數、鎖定、快取std::shared_ptr、std::weak_ptr 即此類
快取代理記憶運算結果Memoization、HTTP Proxy Cache

適用場景

  • 大型圖片/文件載入(瀏覽器圖片預覽)。
  • 資料庫連線池、遠端服務呼叫(gRPC/Thrift Stub)。
  • 存取控制(如資料庫 Row-Level Security)。
  • 智慧指標、RAII 資源管理。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved