接上一篇:(二) IOC的概念和作用

时间:2023-03-09 02:49:32
接上一篇:(二) IOC的概念和作用

控制反转(IoC:Inversion of Control)把创建对象的权利转交给框架(框架的重要特征),并非面向对象的专用术语。 它包含依赖注入(DI:Dependency Injection )

2.1程序的耦合

什么是程序的耦合?

耦合性(Coupling),也叫耦合度,是对程序间关联程度的度量。耦合的强弱取决于模块间接口的复杂性、调用模块的方式以及通过界面传送数据的多少。模块间的耦合度是指模块间的依赖关系,包括控制关系、调用关系、数据传递关系。模块间联系越多,其耦合性越强,同时表明其独立性越差(降低耦合性,可以提高其独立性)。耦合性存在于各个领域,而非软件设计中独有的。

在软件工程中,耦合指的就是对象之间的依赖性。对象之间的耦合度越高,维护成本越高。因此对象的设计应使类和构件之间的耦合最小。软件设计中通常用耦合度和内聚度作为衡量模块独立程度的标注。划分模块的一个准则就是高内聚低耦合。

它有如下分类:

(1)内容耦合:一个模块直接修改或操作另一个模块的数据,或一个模块不通过正常入口而转入另一个模块。内容耦合是最高程度的耦合,应该避免使用之。

(2)公共耦合:两个或两个以上的模块共同引用一个全局数据项。在具有大量公共耦合的结构中,确定究竟是哪个模块给全局变量赋了一个特定的值是非常困难的。

(3)外部耦合:一组模块都访问同一全局简单变量而不是同一全局数据结构,而且不是通过参数传递该全局变量的信息。

(4)控制耦合:一个模块通过接口向另一模块传递一个控制信号,接受信号的模块根据信号值而进行适当的动作。

(5)标记耦合:若一个模块A通过接口向两个模块B和C传递一个公共参数,则称模块B和C之间存在一个标记耦合。

(6)数据耦合:模块之间通过参数来传递数据。数据耦合是最低的一种耦合形式,系统中一般都存在这种类型的耦合,因为为了完成一些有意义的功能,往往需要将某些模块的输出数据作为另一模块的输入数据。

(7)非直接耦合:两个模块之间没有直接的关系,它们之间的联系完全是通过主模块的控制和调用来实现的。

总结:

1.耦合是影响软件复杂度和设计质量的一个重要因素,在设计上我们应采用一下原则:如果模块间必须存在耦合,就尽量使用数据耦合,少用控制耦合,限制公共耦合的范围,尽量避免使用内容耦合。 2.程序讲究的是低耦合、高内聚。就是同一个模块内的各个元素之间要高度紧密,但是各个模块之间的相互依存度却不要那么紧密。

内聚和耦合是密切相关的,同其他模块存在高耦合意味着低内聚,而高内聚的模块意味着该模块同其他模块之间是低耦合。在软件设计中,应力争做到高内聚,低耦合。

1. 早期我们的jdbc操作,注册驱动时,我们为什么不利用DriverManager的registerDriver方法,而是采用Class.forName(“”)的方式加载驱动,降低程序的耦合度。

2. 我们以前的面向接口编程的代码,是否存在着设计问题呢,怎么解决?存在问题,利用工厂模式解决。

如何解耦:

  1. 通过读取配置文件来获取要创建类的全限定类名
  2. 使用反射来创建对象,而避免使用new关键字。

实际开发中遵循的准侧:

编译时不依赖,运行时可以依赖

2.2 利用工厂模式解耦注意事项

对象的创建是否是单例的?

是单例的,衍生出来的一种模式就是单例模式(Spring的工厂也默认用的是单例方式创建对象) 如果是单例的,变量为成员变量或局部变量的区别!

2.3理解控制反转设计模式

调用者不再创建被调用者的实例,由容器创建。这很好理解,就是依赖的双方都不用负责类的实例化操作,我需要哪个对象,容器直接递上来,相当于多了一个管家,所谓衣来伸手、饭来张口,实例化这样的脏活累活全让容器包了。