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

相关推荐
菜鸟一枚在这16 小时前
深入理解设计模式之代理模式
java·设计模式·代理模式
_小苔藓_17 小时前
初探动态规划--记忆化搜索
深度优先·动态规划·代理模式
DanceDonkey3 天前
多层代理模式解析Invocation
代理模式
allnlei3 天前
懒加载代理模式(Lazy Initialization Proxy Pattern)
代理模式
扣丁梦想家3 天前
设计模式教程:代理模式(Proxy Pattern)
设计模式·代理模式
出门撞大运3 天前
Java基础——代理模式
java·开发语言·代理模式
wy02_5 天前
【设计模式】 代理模式(静态代理、动态代理{JDK动态代理、JDK动态代理与CGLIB动态代理的区别})
java·设计模式·代理模式
FLZJ_KL5 天前
【设计模式】【结构型模式】代理模式(Proxy)
java·设计模式·代理模式
找了一圈尾巴6 天前
设计模式-代理模式、外观模式
设计模式·代理模式·外观模式
王燕龙(大卫)7 天前
设计模式:代理模式
设计模式·代理模式