制作网站要步骤,百度哪个网站做贸易,郓城网站建设电话,免费logo在线制作u钙网核心思想
代理模式#xff08;Proxy Pattern#xff09;是一种结构型设计模式#xff0c;其核心思想是为其他对象提供一个代理或占位符#xff0c;以控制对这个对象的访问。代理对象通常会在客户端和目标对象之间起到中介作用#xff0c;可以在不改变目标对象的情况下Proxy Pattern是一种结构型设计模式其核心思想是为其他对象提供一个代理或占位符以控制对这个对象的访问。代理对象通常会在客户端和目标对象之间起到中介作用可以在不改变目标对象的情况下增加额外的功能或控制访问。
解决的问题
代理模式主要解决以下问题 访问控制限制对目标对象的访问例如权限控制、延迟加载等。 功能增强在不修改目标对象的情况下增加额外的功能例如日志记录、性能监控等。 远程代理为位于不同地址空间的对象提供本地代表例如远程方法调用RMI。 虚拟代理延迟创建开销较大的对象直到真正需要时才创建。
使用场景
延迟加载Lazy Loading当对象的创建和初始化成本较高时可以使用代理模式来延迟对象的创建直到真正需要时才进行初始化。 访问控制当需要对对象的访问进行控制时可以使用代理模式来限制或过滤对目标对象的访问。 日志记录当需要在访问对象时记录日志或进行审计时可以使用代理模式来添加日志功能。 远程代理当需要访问远程对象时可以使用代理模式来隐藏网络通信的复杂性。
优点
职责清晰代理模式将客户端与目标对象解耦使得职责更加清晰。 扩展性强可以在不修改目标对象的情况下通过代理对象增加额外的功能。 控制访问代理对象可以控制对目标对象的访问例如权限控制、延迟加载等。
缺点
增加复杂性引入代理对象会增加系统的复杂性尤其是在需要多层代理时。 性能开销代理对象可能会引入额外的性能开销尤其是在远程代理或虚拟代理的情况下。
示例代码
以下是一个简单的 C11 代理模式示例展示了如何使用代理模式来实现延迟加载和日志记录
#include iostream
#include memory
#include string// 目标接口
class Subject {
public:virtual void Request() const 0;virtual ~Subject() default;
};// 真实目标类
class RealSubject : public Subject {
public:void Request() const override {std::cout RealSubject: Handling Request. std::endl;}
};// 代理类
class Proxy : public Subject {
public:Proxy() : realSubject_(nullptr) {}void Request() const override {// 延迟加载真实对象if (!realSubject_) {realSubject_ std::make_uniqueRealSubject();}std::cout Proxy: Logging before handling request. std::endl;realSubject_-Request();std::cout Proxy: Logging after handling request. std::endl;}private:mutable std::unique_ptrRealSubject realSubject_;
};// 模拟客户端代码
void ClientCode(const Subject subject) {subject.Request();
}int main() {std::cout Client: Executing the client code with a real subject: std::endl;RealSubject realSubject;ClientCode(realSubject);//这里客户端直接使用目标对象std::cout std::endl;std::cout \nClient: Executing the client code with a proxy: std::endl;Proxy proxy;ClientCode(proxy);//这里客户端使用代理对象return 0;
}输出结果
Client: Executing the client code with a real subject:
RealSubject: Handling Request.Client: Executing the client code with a proxy:
Proxy: Logging before handling request.
RealSubject: Handling Request.
Proxy: Logging after handling request.代码解析
Subject定义了目标接口RealSubject 和 Proxy 都实现了这个接口。 RealSubject是真实的目标对象负责实际的业务逻辑。 Proxy代理类持有一个 RealSubject 的指针并在 Request 方法中控制对 RealSubject 的访问。代理类在 Request 方法中增加了日志记录功能并实现了延迟加载。 ClientCode客户端代码通过 Subject 接口与目标对象交互无需关心目标对象是 RealSubject 还是 Proxy。
总结
代理模式通过引入代理对象来控制对目标对象的访问可以在不修改目标对象的情况下增加额外的功能或控制访问。它在延迟加载、访问控制、日志记录等场景中非常有用。然而代理模式也会增加系统的复杂性和性能开销因此在使用时需要权衡利弊。