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

C++ 設計模式:代理模式(Proxy Pattern)深度解析

     編輯:關於C++

模式定義

代理模式為其他對象提供一種代理以控制對這個對象的訪問。代理類持有真實對象的引用,實現相同接口,在客戶端調用時可添加額外邏輯(權限檢查、延遲加載、遠程通信等)。

核心角色

  • Subject:定義真實對象與代理的共同接口。
  • RealSubject:真實業務邏輯實現。
  • Proxy:持有 RealSubject 引用,實現 Subject 接口,控制訪問並可添加橫切關注點。

四種常見代理類型

  1. 遠程代理:為不同地址空間的對象提供本地代表(如 RMI、RPC)。
  2. 虛代理:按需創建開銷大的對象(如圖片延遲加載)。
  3. 保護代理:控制對原始對象的訪問權限。
  4. 智能引用:替換裸指針,添加引用計數、鎖定等操作(如智能指針)。

經典案例:引用計數智能指針

智能指針正是代理模式的教科書級應用。SmartPtr 代理裸指針 T*,內部維護引用計數,實現自動內存管理。

代碼實現(核心部分)

template <typename T>
class SmartPtr {
    T* ptr;
    RefCount* ref; // 線程安全引用計數
public:
    SmartPtr(T* p = nullptr) : ptr(p), ref(new RefCount()) { ref->add(); }
    SmartPtr(const SmartPtr& other) : ptr(other.ptr), ref(other.ref) { ref->add(); }
    ~SmartPtr() { if (ref->release()==0) { delete ptr; delete ref; } }
    T& operator*() { return *ptr; }
    T* operator->() { return ptr; }
    SmartPtr& operator=(const SmartPtr& other) {
        if (this != &other) {
            if (ref->release()==0) { delete ptr; delete ref; }
            ptr = other.ptr; ref = other.ref; ref->add();
        }
        return *this;
    }
};

關鍵點

  • RefCount 使用原子操作(InterlockedIncrement/Decrement)保證線程安全。
  • 拷貝構造、賦值、析構三者協同管理引用計數。
  • 重載 operator-> 和 operator* 使代理行為如同裸指針。

總結

代理模式通過「間接層」解耦客戶端與真實對象,是實現 AOP(面向切面編程)的基礎。智能指針、延遲加載、遠程調用、訪問控制皆為其典型應用。掌握代理模式,能極大提升代碼的靈活性與可維護性。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved