ESC
输入关键词搜索文章标题和内容

C语言实现结构型模式:外观、享元、代理

本文由 linuxROS 整理发布,首发于 linuxros.cn,转载请注明出处。

C语言实现结构型模式:外观、享元、代理

导读:本文继续介绍3种结构型设计模式:外观模式统一简化入口、享元模式对象复用省内存、代理模式控制对象访问。全部代码可直接编译运行。


一、原理简析

结构型模式的最后3种模式分别从简化调用、节省资源、控制访问三个角度优化系统设计。

三种模式对比:

模式 核心作用 解决问题
外观 统一简化入口 降低调用复杂度
享元 对象复用 节省内存开销
代理 控制访问 安全、智能、远程

二、实操步骤

2.1 外观模式:统一简化入口

#include <stdio.h>

void SubSystem1(void) { printf("子系统1:初始化\n"); }
void SubSystem2(void) { printf("子系统2:加载数据\n"); }
void SubSystem3(void) { printf("子系统3:执行业务\n"); }

void FacadeWork(void) {
    printf("外观模式统一入口\n");
    SubSystem1();
    SubSystem2();
    SubSystem3();
}

int main(void) {
    FacadeWork();
    return 0;
}

2.2 享元模式:对象复用省内存

#include <stdio.h>
#include <string.h>

#define MAX_POOL 5

typedef struct Flyweight {
    char key[10];
    void (*Operate)(void);
} Flyweight;

static Flyweight pool[MAX_POOL];
static int pool_cnt = 0;

Flyweight* GetFlyweight(const char* key) {
    for(int i=0; i<pool_cnt; i++) {
        if(strcmp(pool[i].key, key) == 0) {
            printf("复用已有:%s\n", key);
            return &pool[i];
        }
    }
    strcpy(pool[pool_cnt].key, key);
    printf("创建新对象:%s\n", key);
    return &pool[pool_cnt++];
}

2.3 代理模式:控制对象访问

#include <stdio.h>

typedef struct Subject {
    void (*Request)(void);
} Subject;

void RealRequest(void) {
    printf("真实业务执行\n");
}

void ProxyRequest(void) {
    printf("代理前置:权限校验\n");
    RealRequest();
    printf("代理后置:日志记录\n");
}

int main(void) {
    Subject proxy = {ProxyRequest};
    proxy.Request();
    return 0;
}

三、对比表格

外观模式
统一封装 | 简化调用 | 降低耦合
↓
享元模式
对象复用 | 节省内存 | 区分内外状态
↓
代理模式
控制访问 | 预处理 | 替代原对象

四、核心流程图

flowchart TB subgraph 结构型续["结构型模式(续)"] A["外观模式<br/>统一封装简化"] B["享元模式<br/>对象复用省内存"] C["代理模式<br/>控制对象访问"] end A --> B B --> C

五、常见问题解决

问题 原因 解决方案
享元模式内外状态混淆 概念不清 内部状态可共享,外部状态不可
代理vs装饰器 目的混淆 代理替代对象,装饰器增强对象
外观过度封装 过度使用 仅在调用复杂时使用

六、总结

本文介绍了3种结构型设计模式的剩余部分。加上期介绍的4种,结构型模式全部完成。

来自 linuxros.cn · linuxROS

结构型模式总结:

模式 核心作用
适配器 接口转换
桥接 分离抽象与实现
装饰器 动态添加功能
组合 树形结构
外观 统一简化入口
享元 对象复用
代理 控制访问

下期预告:《C语言实现行为型模式:策略、模板方法、观察者》—— 行为型模式详解。


关注公众号:linuxros
回复「设计模式」,获取完整23种设计模式C语言实现源码


程序员

版权声明

作者linuxROS
协议本作品采用 CC BY-NC-SA 4.0 许可协议:署名-非商业性使用-相同方式共享
关注欢迎关注微信公众号 linuxROS,获取更多机器人 / 嵌入式 / Linux 干货
返回首页