代理模式
约 765 字大约 3 分钟
2025-06-21
思想:代理模式的核心思想是通过代理控制对真实主题的访问,并在不影响主题对象的情况下,进行一些额外的操作。
// 代理模式(Cpp)
#include <iostream>
// 抽象主题接口
class Subject {
public:
virtual void request() = 0;
virtual ~Subject() {}
};
// 具体主题类
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) {}
void request() override {
if (realSubject == nullptr) {
realSubject = new RealSubject();
}
preRequest();
realSubject->request();
postRequest();
}
~Proxy() {
if (realSubject != nullptr) {
delete realSubject;
}
}
private:
void preRequest() {
std::cout << "Proxy: Preprocessing request." << std::endl;
}
void postRequest() {
std::cout << "Proxy: Postprocessing request." << std::endl;
}
};
// 客户端测试
int main() {
Proxy proxy;
proxy.request();
return 0;
}// 代理模式(Java)
// 代理需求接口
interface Star {
void sing(); // 唱歌
void dance(); // 跳舞
}
// 明星类
class RealStar implements Star {
String name; // 明星名字
RealStar(String name) {
this.name = name;
}
public void sing() {
System.out.println("明星 " + this.name + " 本人: 唱歌");
}
public void dance() {
System.out.println("明星 " + this.name + " 本人: 跳舞");
}
}
// 代理类
class Agent implements Star {
private RealStar realStar; // 要代理的明星
public Agent(RealStar realStar) {
this.realStar = realStar;
}
public void sing() {
receiveMoney(); // 代理的额外操作:进行收费
realStar.sing(); // 实际操作委托给真实的明星
}
public void dance() {
prepareStage(); // 代理的额外操作:准备场地
realStar.dance(); // 实际操作委托给真实的明星
}
// 代理的方法:进行收费
private void receiveMoney() {
System.out.println("经纪人:收取演出费用");
}
// 代理的方法:准备场地
private void prepareStage() {
System.out.println("经纪人:准备演出场地");
}
}
// 客户端测试
public class Main {
public static void main(String[] args) {
RealStar realStar = new RealStar("limou3434");
Agent agent = new Agent(realStar);
// 通过代理执行唱歌和跳舞
agent.sing();
agent.dance();
}
}特点:代理模式的特点如下。
- 实现延迟代理:代理模式可以延迟加载对象,即在需要时才真正创建或初始化对象,这对于资源密集型对象或需要大量计算的对象特别有用
- 实现保护代理:保护代理控制对敏感对象的访问,允许或拒绝对对象的请求,以实现安全性控制
- 实现缓存代理:缓存代理为昂贵或频繁使用的操作结果提供缓存,以提高性能。代理可以在每次调用前检查缓存,避免重复计算或请求
- 实现日志代理:当需要记录方法调用的参数、返回值和执行时间等信息时,可以使用日志记录代理。日志记录代理可以包装真实对象的方法,在调用方法前后添加日志记录的逻辑
- 简化复杂性并且解耦合:代理模式可以隐藏复杂性,使客户端代码更简洁和易于维护。客户端只需与代理进行交互,而不必了解真实对象的复杂逻辑或实现细节。代理模式可以将客户端与真实主题解耦合,客户端只需关注代理即可,代理负责处理和控制真实对象的访问。
更新日志
2025/11/21 13:51
查看所有更新日志