一、开放封闭原则介绍
- OCP:Open Closed Principle 缩写,开放封闭原则。
- 设计良好的软件,应该易于扩展,同时抗拒被修改。
- 下面使用C语言说明这个原则
二、怎样理解开放封闭原则
-
我觉得关键就是抽象。加一层抽象。
-
假如你要使用某个功能
-
-
遵守开放封闭原则之后
-
-
这个意思就是,使用一个功能的时候,不要直接写死相关逻辑。而是把具体实现弄成可以扩展的,以后添加功能具体实现4的时候,一定不会影响其它的功能。
三、实际案例
- 假设需要解析一段SIP 报文的 Message 报文 Body 部分。虽然都是解析,但是根据不同的服务器,解析的规则不能确定。
- 遵守开闭原则之前。这样修改,每次跟不同的服务器交互,都要改这个函数。第0个server的需求变化,可能影响第一个的。而且,如果新加了server 2,可能还要继续修改这个函数。这样就违背了开闭原则。
int handle_sms_body(int server)
{
//这里做一些初始化处理
if(server == 0)//第一种服务器
{
//解析
}
else if(server == 1) //第二种服务器
{
//解析
}
//可能需要别的处理。
return 0;
}
-
- 遵守开闭原则之后。每次有别的server需要处理,只需要在sms_parse_map加上就行,不会影响到原来的其它server的处理。
int do_sms_body_parse_server1(void *param)
{
//解析server1
return 0;
}
int do_sms_body_parse_server0(void *param)
{
//解析server 0
return 0;
}
typedef struct int (*sms_body_parse_callback)(void *param);
typedef struct sms_parse_map_desc
{
int server_type;
sms_body_parse_callback fn;
}sms_parse_map_desc;
//每次有别的server需要处理,只需要在这里加上就行,不会影响到原来的其它server的处理。
sms_parse_map_desc sms_parse_map[]=
{
{0,do_sms_body_parse_server0},//实际应用种,这两个函数可能来自不同的模块。传的参数都不一样。
{1,do_sms_body_parse_server1}
};
int handle_sms_body(int server_type,void *param)//实际问题,这里传入的参数可能不是这么简单。
{
//使用回调,根据server,决定调用do_sms_body_parse_server1 或者 do_sms_body_parse_server0
int i = 0;
for(i=0;i<sizeof(sms_parse_map)/sizeof(sms_parse_map[0]);i++)
{
if(sms_parse_map[i].fn)
{
sms_parse_map[i].fn(param);
}
}
return 0;
}
四、参考文献
1、《架构整洁之道》
2、https://blog.youkuaiyun.com/coderinchina/article/details/50458635