概述
编写基于另外一组类的包装器接口,结构化设计模式可以处理接口包装任务。按照包装器层和原始接口的差异递增程度划分,它们以此是:代理、适配器和外观。
<1>代理模式
代理类和原始类拥有同样的接口,可以认为是一个单一组件包装器,
实现方式:代理类 存储 原始类的副本,但更可能是指向原始类的指针,然后代理类中的方法将重定向到原始类对象中的同名方法,
注意:将赋值构造函数和赋值操作函符声明为私有成员是为了阻止客户复制此对象
微信截图_20190402160855.png
class Proxy {
public :
Proxy() : mOrig(new Original()) {}
~Proxy(){
delete mOrig;
}
bool DoSomething(int value) {
return mOrig->DoSomething(value);
}
private :
Proxy(const Proxy &);
const Proxy &operator=(const Proxy &);
Original *mOrig;
}
<1-1>代理模式
另一种方案是在此方案的基础上增加代理和原始API共享虚拟接口,目的是更好的保持这两个api同步
前提是能够修改原始API
class IOriginal {
public:
virtual bool DoSomething(int value) = 0;
};
class Original : public IOriginal {
public:
bool DoSomething(int value);
}
class Proxy : public IOriginal {
public :
Proxy() : mOrig(new Original()) {}
~Proxy(){
delete mOrig;
}
bool DoSomething(int value) {
return mOrig->DoSomething(value);
}
private :
Proxy(const Proxy &);
const Proxy &operator=(const Proxy &);
Original *mOrig;
}
提示:代理提供了一个接口,此接口将函数调用转发到具有相同形式的另一个接口
试用场景
如果要修改Original类的行为但是要保持它的接口不变,代理模式非常适合,它尤其适用于Original是第三方库类,自己很难直接修改.
网友评论