代理模式-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. 需要对目标对象进行保护,隐藏其具体实现细节。

相关推荐
what丶k3 天前
深入理解贪心算法:从原理到经典实践
算法·贪心算法·代理模式
hrrrrb4 天前
【算法设计与分析】贪心算法
算法·贪心算法·代理模式
懵萌长颈鹿5 天前
代理模式 (Proxy Pattern)
代理模式
weixin_403810136 天前
EasyClick 安卓自动化版本 如何自激活代理模式并且启动安卓的自动化服务
android·自动化·代理模式
亲爱的非洲野猪6 天前
2动态规划进阶:背包问题详解与实战
算法·动态规划·代理模式
亲爱的非洲野猪7 天前
动态规划进阶:树形DP深度解析
算法·动态规划·代理模式
apolloyhl11 天前
Proxy 代理模式
代理模式
爱编码的傅同学11 天前
【今日算法】LeetCode 5.最长回文子串 和 287.寻找重复数
算法·leetcode·代理模式
玄冥剑尊11 天前
动态规划入门
算法·动态规划·代理模式
蜜汁小强14 天前
macOS 上的git代理配置在哪里
git·macos·代理模式·proxy模式