代理模式為其他對象提供一種代理以控制對這個對象的訪問。代理類持有真實對象的引用,實現相同接口,在客戶端調用時可添加額外邏輯(權限檢查、延遲加載、遠程通信等)。
RealSubject 引用,實現 Subject 接口,控制訪問並可添加橫切關注點。智能指針正是代理模式的教科書級應用。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(面向切面編程)的基礎。智能指針、延遲加載、遠程調用、訪問控制皆為其典型應用。掌握代理模式,能極大提升代碼的靈活性與可維護性。