设计模式(12)-代理模式及实现
基本概念
提供了一个代理对象,它充当了原始对象的替代品,以控制对原始对象的访问。代理对象与原始对象实现相同的接口,使得客户端可以无缝地切换和使用。代理对象可以对客户端的请求进行拦截、修改或增强,然后将请求传递给原始对象。
优点:
● 远程代理(Remote Proxy): 代理对象可以隐藏原始对象存在于远程服务器上的事实,使得客户端可以透明地访问远程对象。这对于分布式系统非常有用。
● 虚拟代理(Virtual Proxy): 当创建原始对象需要大量资源时,代理对象可以充当一个轻量级的替代品,延迟原始对象的实际创建和初始化,从而提高性能。
● 保护代理(Protection Proxy): 代理对象可以控制对原始对象的访问权限,确保只有具有特定权限的客户端可以访问原始对象。
● 缓存代理(Cache Proxy): 代理对象可以缓存原始对象的结果,以便在后续相同请求时能够直接返回缓存的结果,减少重复计算。
● 日志记录代理(Logging Proxy): 代理对象可以在访问原始对象之前或之后记录日志,用于调试、监控或审计。
https://gitee.com/want-to-lose-another-30-jin/design-pattern-implementation
设计模式具体实现
角色
1、主题(Subject):
定义了真实对象和代理对象的共同接口,这样代理就可以在任何期望真实对象出现的地方使用。
2、真实主题(Real Subject):
定义了代理所代表的真实对象,实现了真实的业务逻辑。
3、代理(Proxy):
包含对真实主题的引用,提供与真实主题相同的接口,并控制对真实主题的访问。代理可以在访问真实主题之前或之后添加额外的处理逻辑。
java实现
package shejimoshi.dailimoshi;
// 主题接口
public interface Subject {
void request();
}
package shejimoshi.dailimoshi;
// 真实主题
public class RealSubject implements Subject {
@Override
public void request() {
System.out.println("RealSubject: Handling request.");
}
}
package shejimoshi.dailimoshi;
// 代理
public class Proxy implements Subject {
private RealSubject realSubject;
public Proxy() {
this.realSubject = null;
}
public void setRealSubject(RealSubject realSubject) {
this.realSubject = realSubject;
}
@Override
public void request() {
if (realSubject == null) {
realSubject = new RealSubject();
}
System.out.println("Proxy: Logging before request.");
realSubject.request();
System.out.println("Proxy: Logging after request.");
}
}
package shejimoshi.dailimoshi;
public class client {
public static void main(String[] args) {
Proxy proxy = new Proxy();
proxy.request(); // 使用代理访问真实主题
}
}
c++实现
#include<iostream>
// 主题接口
class Subject {
public:
virtual ~Subject() {}
virtual void request() = 0;
};
// 真实主题
class RealSubject : public Subject {
public:
void request() override {
std::cout << "RealSubject: Handling request." << std::endl;
}
};
// 代理
class Proxy : public Subject {
private:
RealSubject* realSubject;
public:
Proxy() : realSubject(nullptr) {}
~Proxy() {
delete realSubject;
}
void setRealSubject(RealSubject* rs) {
realSubject = rs;
}
void request() override {
if (realSubject == nullptr) {
realSubject = new RealSubject();
}
std::cout << "Proxy: Logging before request." << std::endl;
realSubject->request();
std::cout << "Proxy: Logging after request." << std::endl;
}
};
// 客户端
int main() {
Proxy* proxy = new Proxy();
proxy->request(); // 使用代理访问真实主题
delete proxy;
return 0;
}