代理模式-C语言实现

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,并通过代理对象来发起请求。

代理模式的优点:

  1. 可以实现对目标对象的访问控制,例如验证权限、监控访问等。

  2. 可以实现延迟加载,当真正需要时才创建或访问目标对象,提高系统性能。

  3. 可以隐藏目标对象的具体实现细节,保护目标对象的安全。

代理模式的缺点:

  1. 增加了系统复杂性,引入了额外的代理对象。

  2. 可能会降低系统的性能,特别是在需要频繁访问目标对象时。

适用场景:

  1. 需要对访问对象进行控制和管理,如权限验证、缓存等。

  2. 需要对目标对象进行扩展,例如增加额外的操作。

  3. 需要对目标对象进行保护,隐藏其具体实现细节。

相关推荐
ydd1001003 小时前
正则表达式匹配
正则表达式·代理模式
LayZhangStrive2 天前
设计模式(二)装饰器模式、代理模式(待更新)
设计模式·代理模式·装饰器模式·后端开发
Lam Tang7 天前
APS 系列文章10
java·代理模式
Lam Tang7 天前
APS 系列文章 08
java·代理模式
wangjialelele7 天前
动态规划DP经典题型总结(Java、C++):路径、子数组、子序列、背包问题详解
java·c++·算法·面试·动态规划·代理模式
聪明蛋子哟7 天前
从MCP到A2A再到Proxy:Agent-工具协议的三种代理模式
代理模式
Lam Tang7 天前
APS 系列文章 09
java·代理模式
Lam Tang8 天前
APS 系列文章 01
java·代理模式
只吃不吃香菜13 天前
Windows 下基于 YAML 规则的指定域名分流:以哔哩哔哩为例
网络·网络协议·计算机网络·网络安全·代理模式
zhongjunyao16 天前
Spec-Driven Development (SDD): The Definitive 2026 Guide
javascript·spring boot·python·eclipse·代理模式