耦合的三种形式

耦合的三种形式框架

  • 不透明耦合,代理

    部件A直接或经过代理B驱动部件C,部件A知道部件C的存在日志

  • 单边透明耦合,it

    部件A驱动代理B,代理B驱动部件C,部件A不知道部件C的存在,部件C知道部件A的存在变量

  • 双边透明耦合。程序

    部件A驱动代理B,代理B驱动部件C,部件A、C相互不知道对方的存在方法

此处解释一下“驱动”这个词。 系统运做必定是有一个动力源的,同一时刻A,C两个部件协做,其中一方必定是驱动方,另外一方必定是被驱动方。有人可能抬杠说,物理上力是相互的,同一时刻A,C是互为驱动方,被驱动方的。实际上能够将这个时刻分两个方向来观察,若是你站在A的角度,将A看做驱动方,那么C就是被驱动方,你求一个值F1;若是你站在C的角度看,将C看做驱动方,A看做被驱动方,你再求一个值F2。那么F1 + F2 和你用其余方法求出来的结果是同样的。总结

在上面对耦合的三种形式的描述中,我将部件A看做是驱动方,A是一个逻辑代号,在实际系统中,它能够表明任何实际部件。所以你能够站在任何实际部件的角度思考此部件和被它驱动的部件的耦合形式。数据

这三种耦合形式分别由低到高表明了两个部件耦合的松散程度。协议

不透明耦合是耦合程度最紧密的,它要求部件A知道部件C的存在,并直接或经过代理驱动它,部件A是动力源(这和单边透明不一样,单边透明驱动部件C的动力源是代理B)。一般来讲,不透明耦合预示着部件A和C最多处于职能分离状态,而时空上是紧耦合的。好比齿轮和传动轴的不透明耦合;好比在主程序中调用log4j的logger.warn(),则主程序和日志程序是不透明耦合的,虽然log4j将打印日志的职能同主程序分离了,但主程序在时间和空间上都和log4j紧密耦合着。

单边透明耦合较不透明耦合要松散,在这种形式下部件A不知道部件C的存在,但部件C知道部件A的存在,而且代理B会替代部件A来驱动部件C。每每这种形式的耦合,代理B是以工做方式1(将"部件和部件"的耦合拆为"部件和协议"的耦合)工做的。典型的例子就是AOP,切点(A)不知道切面(C)的存在,而切面(C)知道切点(A)的存在,切面(C)被框架(代理B)所驱动。因为切点对切面不透明,因此切面和切点耦合,但切点不和切面耦合。这实际上意味着,当切点发生变化时,它并不对切面的故障负责。切点也没有和框架达成协议,因此对切点来讲,框架和切面都是透明的。故叫单边透明耦合。

双边透明耦合是耦合程度最松散的,在这种形式下,部件A不须要知道部件C的存在,部件C也不须要知道部件A的存在,代理B替代部件A驱动部件C。一样,代理B是工做方式1。典型例子,Vue、React、Angular的双向数据绑定,输入框操做一个变量,文本框根据这个变量改变内容,输入框不知道文本框的存在,文本框也不知道输入框的存在,双方经过框架(代理B)协做。还有RabbitMQ,消息生产者不知道消息消费者的存在,消息消费者不知道消息生产者的存在,双方经过交换机(代理B)协做。

单边透明耦合和双边透明耦合都使得部件A和部件C是在职能上分离的,时空上隔离的。单边透明耦合优于不透明耦合的地方在于,它将被驱动方从驱动方中隔离出去,被驱动方不会对驱动方产生任何影响(若是有影响,则这个影响属于驱动关系调换后的场景,本质上是从另外一个角度思考的结果)。双边透明耦合强大的地方在于,协做双方存在数量是任意的(包括存在与否),协做双方的协做机制是任意的,因此它是目前我所知道的,耦合程度最低的一种协做形式。

总结:三种耦合形式,有其存在的必要性,但追求松散耦合的系统应尽量的在三种耦合形式中向后选择

相关文章
相关标签/搜索