UML图:
代码实现:
#include <stdio.h>
// 抽象主题接口
typedef struct {
void (*request)(void*);
} Subject;
// 具体主题类
typedef struct {
void (*request)(void*);
} RealSubject;
void RealSubject_request(void* obj) {
printf("RealSubject: Handling request\n");
}
RealSubject createRealSubject() {
RealSubject subject;
subject.request = RealSubject_request;
return subject;
}
// 代理类
typedef struct {
RealSubject realSubject;
void (*request)(void*);
} Proxy;
void Proxy_request(void* obj) {
Proxy* proxy = (Proxy*)obj;
printf("Proxy: Logging request\n");
proxy->realSubject.request(&proxy->realSubject);
printf("Proxy: Logging response\n");
}
Proxy createProxy() {
Proxy proxy;
proxy.realSubject = createRealSubject();
proxy.request = Proxy_request;
return proxy;
}
int main() {
Proxy proxy = createProxy();
proxy.request(&proxy);
return 0;
}
在上面的示例代码中,首先定义了抽象主题接口Subject
,其中包含了一个请求处理的函数指针。然后定义了具体主题类RealSubject
,它实现了抽象主题接口中的函数。
接着定义了代理类Proxy
,它包含了一个指向具体主题对象的引用,并实现了与具体主题相同的接口函数。
在main
函数中,创建了代理对象proxy
,并通过代理对象来发起请求。
代理模式的优点:
-
可以实现对目标对象的访问控制,例如验证权限、监控访问等。
-
可以实现延迟加载,当真正需要时才创建或访问目标对象,提高系统性能。
-
可以隐藏目标对象的具体实现细节,保护目标对象的安全。
代理模式的缺点:
-
增加了系统复杂性,引入了额外的代理对象。
-
可能会降低系统的性能,特别是在需要频繁访问目标对象时。
适用场景:
-
需要对访问对象进行控制和管理,如权限验证、缓存等。
-
需要对目标对象进行扩展,例如增加额外的操作。
-
需要对目标对象进行保护,隐藏其具体实现细节。