您的位置:首页 > 其它

第一章,走向灵活软件之路-面向对象的六大原则

2018-01-15 15:30 190 查看
一、实现图片加载功能引出面向对象的原则

功能1:实现图片的获取,显示

1、将获取图片、显示图片的功能都写到一个类中;

优化:将获取图片、显示图片的功能单独抽出一个类;(优化代码的第一步,单一职责原则。)

功能2:在1的基础上,增加几种获取图片的方式

2、将获取图片的每一种方式都抽取作为一个类,提供put,set公共方法,修改显示图片的类的逻辑,通过new和if else来实现对几个获取图片的类的切换使用。

优化:new对象硬编码的方式不好测试,if else方式降低程序可读性、复杂度高,维护难。并且每次增加方式都要修改显示图片的类的逻辑,应该让遵循开闭原则,让程序更稳定、更灵活。因此,要面向接口编程,抽象一个获取图片的接口,提供put,set公共方法,遵循控制反转原则,通过依赖注入的方式,如提供set方法,将接口作为参数,降低对象间的耦合度,扩展性更强。

备注:

控制反转

控制反转(Inversion of Control,缩写为IoC),是面向对象编程中的一种设计原则,可以用来减低计算机代码之间的耦合度。其中最常见的方式叫做依赖注入(Dependency Injection,简称DI),还有一种方式叫“依赖查找”(Dependency Lookup)。通过控制反转,对象在被创建的时候,由一个调控系统内所有对象的外界实体,将其所依赖的对象的引用传递给它。也可以说,依赖被注入到对象中。

技术分析:

因为大多数应用程序都是由两个或是更多的类通过彼此的合作来实现企业逻辑,Class A中用到了Class B的对象b,一般情况下,需要在A的代码中显式的new一个B的对象。

采用依赖注入技术之后,A的代码只需要定义一个私有的B对象,不需要直接new来获得这个对象,而是通过相关的容器控制程序来将B对象在外部new出来并注入到A类里的引用中。

依赖注入原理

具体的实现方式:

1、基于接口。实现特定接口以供外部容器注入所依赖类型的对象。

2、基于 set 方法。实现特定属性的public set方法,来让外部容器调用传入所依赖类型的对象。

3、基于构造函数。实现特定参数的构造函数,在新建对象时传入所依赖类型的对象。

4、基于注解。

问题汇总

1、参与者都有谁?

答:一般有三方参与者,一个是某个对象;一个是IoC/DI的容器;另一个是某个对象的外部资源。又要名词解释一下,某个对象指的就是任意的、普通的Java对象; IoC/DI的容器简单点说就是指用来实现IoC/DI功能的一个框架程序;对象的外部资源指的就是对象需要的,但是是从对象外部获取的,都统称资源,比如:对象需要的其它对象、或者是对象需要的文件资源等等。

2、依赖:谁依赖于谁?为什么会有依赖?

答:某个对象依赖于IoC/DI的容器。依赖是不可避免的,在一个项目中,各个类之间有各种各样的关系,不可能全部完全独立,这就形成了依赖。传统的开发是使用其他类时直接调用,这会形成强耦合,这是要避免的。依赖注入借用容器转移了被依赖对象实现解耦。

3、注入:谁注入于谁?到底注入什么?

答:通过容器向对象注入其所需要的外部资源

4、控制反转:谁控制谁?控制什么?为什么叫反转?

答:IoC/DI的容器控制对象,主要是控制对象实例的创建。反转是相对于正向而言的,那么什么算是正向的呢?考虑一下常规情况下的应用程序,如果要在A里面使用C,你会怎么做呢?当然是直接去创建C的对象,也就是说,是在A类中主动去获取所需要的外部资源C,这种情况被称为正向的。那么什么是反向呢?就是A类不再主动去获取C,而是被动等待,等待IoC/DI的容器获取一个C的实例,然后反向的注入到A类中。

5、依赖注入和控制反转是同一概念吗?

答:从上面可以看出:依赖注入是从应用程序的角度在描述,可以把依赖注入描述完整点:应用程序依赖容器创建并注入它所需要的外部资源;而控制反转是从容器的角度在描述,描述完整点:容器控制应用程序,由容器反向的向应用程序注入应用程序所需要的外部资源。

总结:

上面的例子凸显了,单一职责、开闭原则的重要性。

依赖倒置原则可从横向的角度看,是针对依赖关系,进行解耦,依赖倒置其实也就是上面的控制反转。

里氏替换原则可从垂直的角度看,核心原理是抽象,抽象又依赖于继承这个特性,子类可扩展父类的方法,提高功能扩展性。

接口隔离原则,这个在文中对IO流的关闭的例子上可以看出,仅对关闭这个功能进行抽象,不仅使代码更简洁,同时也做到了隐藏了具体对象的细节,使系统耦合度更低。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: