C语言的设计模式-依赖倒置

依赖倒置:就是要依赖于抽象,不要依赖于具体。简单的说就是要求对抽象进行编程,不要对实现进行编程,这样就降低了客户与实现模块间的耦合。

假设一个客户端可以根据不同的终端智能显示,面向过程的处理流程结构图如下:

客户端代码流程如下:

if (type == Teminal1)
{
    T1_disply();
}
else if(type == Teminal2)
{
    T2_disply();
}

功能实现没有任何问题,考虑到软件的扩展如果增加一个新的终端我们再客户端的流程中就要加一个判断分支,如果系统够复杂后果往往是在流程中遍布判断,对后期的开发、维护都是艰巨的任务。产生这种结果的原因是业务依赖了底层的具体实现,两者完全耦合在一起。我们需要依赖一个稳定的接口。在面向对象的语言比如JAVA,接口在语言级别都是支持的,实现起来相对直观,但只要理解了设计的本质,在C中实现接口依赖也很容易。修改一下设计,在业务和底层间增加一个接口层:

 

代码流程如下:

1:接口定义:

/*ITerminal.h*/
typedef struct Terminal_s Terminal_t; struct Terminal_s { void (*display)(); };

2:终端实现:

#include "ITerminal.h"
void Terminal1_display()
{
    printf("Terminal1_display \r\n");
}

Terminal_t init_Terminal1()
{
    Terminal_t t;
    t.display = Terminal1_display;
    return t;
}

3:客户端:


Terminal_t t;
t = init_Terminal1();
t.display();

可以看到我们在业务层和底层间定义了ITerminal.h这个接口层,业务和底层都依赖这个接口,如果新增了终端在客户端完全感知不到,客户端只知道display这个接口。

业务中的主流程通常是高层模块,当高层依赖底层时一定不能让底层的修改影响到高层,否则业务的主流程将变得臃肿不堪,而依赖倒置原则可以很好的解决这个问题。

 
posted @ 2013-01-08 21:54  平凡之路  阅读(3713)  评论(2编辑  收藏  举报