内聚,耦合,解耦和,依赖倒置

内聚:
通俗的来讲,就是自己的东西自己保管,自己的事情自己做。自己拥有的东西让别人来碰 你肯定也很不舒服吧

微观 数据+操作
中观 数据结构+算法
宏观 对象+消息


耦合度··解耦和

耦合的程度就是耦合度,也就是双方依赖的程度。上文所说的妈妈和baby就是强耦合。而你跟快递小哥之间则是弱耦合。一般来说耦合度过高并不是一件好事。就拿作为IT精英的你来说吧,上级随时敦促你的工作进度,新手频繁地需要你指导问题,隔三差五还需要参加酒局饭局,然后还要天天看领导的脸色、关注老婆的心情,然后你还要关注代码中的bug 、bug、bug,和需求的变化、变化、变化,都够焦头烂额了,还猝不及防的要关注眼睛、颈椎、前列腺和头发的状态,然后你再炒个股,这些加起来大概就是个强耦合了。从某种意义上来说,耦合天生就与自由为敌,无论是其他对象依赖于你,还是你依赖其他对象。比如有人嗜烟、酗酒,你有多依赖它们就有多不自由;比如有人家里生了七八个娃,还有年迈的父母、岳父母,他们有多依赖你,你就有多不自由。所以老子这样讲:“五音令人耳聋,五色令人目盲,驰骋狩猎令人心发狂,难得之货令人行妨。”卢梭也是不无悲凉的说“人生而自由,却又无往而不在枷锁中”。因此,要想自由,就必须要降低耦合,而这个过程就叫做解耦和。


·依赖倒置(Dependence Inversion Principle)
解耦和最重要的原则就是依赖倒置原则:

高层模块不应该依赖底层模块,他们都应该依赖抽象。抽象不应该依赖于细节,细节应该依赖于抽象。

 

tcpServerEngine是StriveEngine.dll提供通信引擎,它发布有一个MessageReceived事件。假设我定义了一个CustomizeHandler类来用于消息处理,那么CustomizeHandler的内部需要预定tcpServerEngine的MessageReceived事件,因此customizeHandler依赖于tcpServerEngine,这就是一个普通的依赖关系,也就是高层模块依赖于低层模块。

tcpServerEngine
MessageReceived事件


CustomizeHandler
注册到tcpServerEngine的MessageReceived事件


形成依赖关系 也就是高层模块依赖于低层模块


ESFramework定义了一个IcustomizeHandler接口,用户在进行消息处理时,实现该接口,然后将其注入到rapidPassiveEngine客户端通信引擎之中


class CustomizeHandler: ICustomizeHandler
{
public void HandleInformation(string sourceUserID, int informationType, byte[] info)
{
······
}

public byte[] HandleQuery(string sourceUserID, int informationType, byte[] info)
{
······
}
}

IRapidPassiveEngine rapidPassiveEngine = ESPlus.Rapid.RapidEngineFactory.CreatePassiveEngine();
CustomizeHandler customizeHandler = new CustomizeHandler();
rapidPassiveEngine.Initialize("ID", "passWord", "127.0.0.1", 9000, customizeHandler);


很明显,相比于上一个例子,这里的依赖关系变成了rapidPassiveEngine依赖于customizeHandler,也就是说依赖关系倒置了过来,上层模块不再依赖于底层模块,而是它们共同依赖于抽象。rapidPassiveEngine依赖的是IcustomizeHandler接口类型的参数,customizeHandler同样是以实现的接口的方式依赖于IcustomizeHandler——这就是一个依赖倒置的典范。


共同去依赖 一个抽象的东西

最最初 B(框架里的处理消息的方法,底层)是需要有消息处理的具体方法A(用户自定义的处理方法) 通过事件委托 达到最初A注入用户自定的处理消息方法A

最初 A(消息处理,高层)要实现功能需要有一个B(框架的事件,底层)对象
{这里好像就实现了依赖倒置 此时A的消息处理方法起作用需要拿到B的事件并注入进去}

B(事件,底层) 去依赖 一个抽象的接口C(抽象接口)

A(消息处理,高层)实现接口C(抽象接口)

C相当于 一个参数的规范 规定, 里边要有的参数 属性 方法 等等 都可以在里边

底层需要自由,不需要依赖 等待一个具体的方法, 因此 我抽象出来一个接口,规范一下如果你想你的出里消息的方法起作用,就按照这个接口时间我需要用到的方法,此时诞生了C(抽象的接口) 此时底层继续运作 这叫 共同以来抽象, 依赖接口

 

 

 大部分转载,加入自己的理解,以交流学习用

 

posted @ 2018-01-31 15:34  叫我张先生  阅读(508)  评论(0编辑  收藏  举报