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语言实现源码