开闭原则

一、开放封闭原则介绍

  • 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.csdn.net/coderinchina/article/details/50458635

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值