代理模式是一种结构型设计模式,也叫做委托模式。它允许你提供一个间接访问对象的方式。代理模式可以在不修改被代理对象的基础上,通过扩展代理类,进行一些功能的附加与增强。值得注意的是,代理类和被代理类应该共同实现一个接口,或者是共同继承某个类 。
在编程中,代理模式是一种设计模式,其主要目的是在不改变原始对象接口的前提下,为其他对象提供一个代理以控制对这个对象的访问,这种模式通常用于需要对某个类进行访问控制或者需要对系统性能进行优化的情况。
代理模式包含两种类型:静态代理和动态代理,静态代理是在编译时就确定了代理类和被代理类的关系,而动态代理则是在运行时动态生成代理类,这两种代理模式都有各自的优点和缺点,具体使用哪种取决于具体的应用场景。
以下是一个简单的代理模式的例子,我们有一个接口Subject
,它有一个方法request()
,我们希望通过代理来控制对request()
方法的访问。
我们定义Subject
接口: python class Subject : public virtual void request() { public : virtual void execute() = 0 ; };
我们创建一个实现了Subject
接口的具体类RealSubject
: python class RealSubject : public virtual Subject { public : void request() override { std :: cout << "RealSubject: Handling request." << std :: endl; } virtual void execute() override { std :: cout << "RealSubject: Executing real request." << std :: endl; } };
我们创建一个Proxy
类,它是Subject
接口的实现,并持有一个RealSubject
的引用: python class Proxy : public virtual Subject { private : Subject *real_subject_ = nullptr ; public : void set_real_subject(Subject *real_subject) { real_subject_ = real_subject; } virtual void request() override { if (real_subject_ != nullptr) real_subject_->request(); else std :: cout << "Proxy: No real subject available." << std :: endl; } virtual void execute() override { if (real_subject_ != nullptr) real_subject_->execute(); else std :: cout << "Proxy: No real subject available." << std :: endl; } };
我们在主函数中测试这个代理模式: python int main(int argc, char const *argv[]) { Subject *real_subject = new RealSubject(); Proxy *proxy = new Proxy(); proxy -> set_real_subject(real_subject); proxy -> request(); proxy -> execute(); delete real_subject; delete proxy; return 0; }
在这个例子中,当我们调用proxy -> request()
时,实际上是调用了RealSubject
的request()
方法,当我们调用proxy -> execute()
时,实际上是调用了RealSubject
的execute()
方法,这就是代理模式的基本工作方式。