五、接口隔离原则

1. 定义

i.  客户端不应该依赖那些它不需要的接口。

ii.  一旦一个接口太大,则需要将它分割成一些更细小的接口,使用该接口的客户端仅需知道与之相关的方法即可。

2.分析

i.  接口隔离原则是指使用多个专门的接口,而不使用单一的总接口。每一个接口应该承担一种相对独立的角色,不多不少,不干不该干的事,该干的事都要干。

ii. 使用接口隔离原则拆分接口时,首先必须满足单一职责原则,将一组相关的操作定义在一个接口中,且在满足高内聚的前提下,接口中的方法越少越好。

iii.  可以在进行系统设计时采用定制服务的方式,即为不同的客户端提供宽窄不同的接口,只提供用户需要的行为,而隐藏用户不需要的行为

3.实例

i. 下图展示了一个拥有多个客户类的系统,在系统中定义了一个巨大的接口(胖接口)AbstractService来服务所有的客户类。如图所示:

图(一)

图(二)

图(一)和图(二)分析:

图(一)为什么到图(二)哪?因为这样做既满足了接口隔离原则,又满足了单一原则,何乐而不为呢,但是也带来了很多的不便,类增多了。

总结:类应该完全依赖相应的专门的接口

六、合成复用原则

1.定义

i. 尽量使用对象组合,而不是继承来达到复用的目的。

2.分析

i.  合成复用原则就是指在一个新的对象里通过关联关系(包括组合关系和聚合关系)来使用一些已有的对象,使之成为新对象的一部分;新对象通过委派调用已有对象的方法达到复用其已有功能的目的。简言之:要尽量使用组合/聚合关系,少用继承。

ii. 在面向对象设计中,可以通过两种基本方法在不同的环境中复用已有的设计和实现,即通过组合/聚合关系或通过继承。

a)  继承复用:实现简单,易于扩展。破坏系统的封装性;从基类继承而来的实现是静态的,不可能在运行时发生改变,没有足够的灵活性;只能在有限的环境中使用。(“白箱”复用 )

b) 组合/聚合复用:耦合度相对较低,选择性地调用成员对象的操作;可以在运行时动态进行。(“黑箱”复用 )

iii. 组合/聚合可以使系统更加灵活,类与类之间的耦合度降低,一个类的变化对其他类造成的影响相对较少,因此一般首选使用组合/聚合来实现复用;其次才考虑继 承,在使用继承时,需要严格遵循里氏代换原则,有效使用继承会有助于对问题的理解,降低复杂度,而滥用继承反而会增加系统构建和维护的难度以及系统的复杂 度,因此需要慎重使用继承复用。

3. 实例

i. 某教学管理系统部分数据库访问类设计如图所示:

图(一)

图(二)

图(一)和图(二)分析:

图(一)为什么到图(二)哪?因为如果需要更换数据库连接方式,如原来采用JDBC连接数据库,现在采用数据库连接池连接,则需要修改DBUtil类源代码。如果StudentDAO采用JDBC连接,但是TeacherDAO采用连接池连接,则需要增加一个新的DBUtil类,并修改StudentDAO或TeacherDAO的源代码,使之继承新的数据库连接类,这将违背开闭原则,系统扩展性较差。

总结:类中应用,尽量使用对象组合而不是用继承来达到复用的目的。

七、迪米特法则

1. 定义

i. 每一个软件单位对其他的单位都只有最少的知识,而且局限于那些与本单位密切相关的软件单位。

2. 分析

i.迪米特法则就是指一个软件实体应当尽可能少的与其他实体发生相互作用。这样,当一个模块修改时,就会尽量少的影响其他的模块,扩展会相对容易,这是对软件实体之间通信的限制,它要求限制软件实体之间通信的宽度和深度。

ii. 狭义的迪米特法则:可以降低类之间的耦合,但是会在系统中增加大量的小方法并散落在系统的各个角落,它可以使一个系统的局部设计简化,因为每一个局部都不 会和远距离的对象有直接的关联,但是也会造成系统的不同模块之间的通信效率降低,使得系统的不同模块之间不容易协调。

iii. 广义的迪米特法则:指对对象之间的信息流量、流向以及信息的影响的控制,主要是对信息隐藏的控制。信息的隐藏可以使各个子系统之间脱耦,从而允许它们独立 地被开发、优化、使用和修改,同时可以促进软件的复用,由于每一个模块都不依赖于其他模块而存在,因此每一个模块都可以独立地在其他的地方使用。一个系统 的规模越大,信息的隐藏就越重要,而信息隐藏的重要性也就越明显。

iv. 迪米特法则的主要用途在于控制信息的过载。

1.在类的划分上,应当尽量创建松耦合的类,类之间的耦合度越低,就越有利于复用,一个处在松耦合中的类一旦被修改,不会对关联的类造成太大波及

2.在类的结构设计上,每一个类都应当尽量降低其成员变量和成员函数的访问权限

3.在类的设计上,只要有可能,一个类型应当设计成不变类

4.在对其他类的引用上,一个对象对其他对象的引用应当降到最低。

3. 实例

i.某系统界面类(如Form1、Form2等类)与数据访问类(如DAO1、DAO2等类)之间的调用关系较为复杂。如图所示:

图(一)

图(二)

图(一)和图(二)分析:

图(一)为什么到图(二)哪?因为这样就可以降低类的耦合性,是类中功能更加单一,相当于外观模式。

总结:一个软件实体应当尽可能少的与其他实体发生相互作用

综述:以上就是其中程序员必备的七大面向对象设计原则,原则犹如国家的法规,这就是面向对象的准则,要使我们的编程更加灵活,封装性更好,复用性 更高,易于维护我们需要我们的这些原则建设我们规范我们的程序。这样我们编写的才是高质量的程序。我们每个人都这样去做,我们的编程水平一定会进步一大 截!

感谢大家的支持,无论是顶的,还是踩的,都谢谢你们,希望大家互相关注,共同进步。

上接:程序员必备的七大面向对象设计原则(二)

转自:http://blog.csdn.net/qiulongtianshi/article/details/7607351

程序员必备的七大面向对象设计原则(三)相关推荐

  1. 七大面向对象设计原则及其举例

    面向对象设计中常见的设计原则 开闭原则 单一职责原则 里氏替换原则 依赖倒置原则 接口隔离原则 最少知识原则(迪米特法则) 少用继承多用组合(合成复用原则) 一.开闭原则 定义:一个软件实体应当对外扩 ...

  2. 程序员应知道这十大面向对象设计原则

    面向对象设计原则是OOPS编程的核心, 但我见过的大多数Java程序员热心于像Singleton (单例) . Decorator(装饰器).Observer(观察者) 等设计模式, 而没有把足够多的 ...

  3. webservice入参是一个对象_程序员技术精进:面向对象与服务的分析与设计

    面向对象分析与设计 面向对象分析与设计是指根据面向对象方法学对软件系统进行分析与设计.在面向对象分析与设计的定义中有三个关键词:面向对象.分析.设计.所以,为了更好地理解面向对象分析与设计的作用,我们 ...

  4. 技术图文:01 面向对象设计原则

    01 面向对象设计原则 知识结构: 一碟开胃的小菜 小菜今年计算机专业大四了,学了不少软件开发方面的东西,也学着编了些小程序,踌躇满志,一心要找一个好单位.当投递了无数简历后,终于收到了一个单位的面试 ...

  5. 程序员必备的思维能力:抽象思维

    若想捉大鱼,就得潜入深渊.深渊里的鱼更有力,也更纯净.硕大而抽象,且非常美丽.--大卫·林奇 抽象思维是我们工程师最重要的思维能力.因为软件技术 本质上就是一门抽象的艺术.我们的工作是存思维的&quo ...

  6. 面向对象设计原则OO

    面向对象设计原则是OOPS(Object-Oriented Programming System,面向对象的程序设计系统)编程的核心,但大多数Java程序员追逐像Singleton.Decorator ...

  7. [转]后端程序员必备:书写高质量SQL的30条建议

    以下文章来源于捡田螺的小男孩 ,作者捡田螺的小男孩 转载:<后端程序员必备:书写高质量SQL的30条建议> 前言 本文将结合实例demo,阐述30条有关于优化SQL的建议,多数是实际开发中 ...

  8. Java面向对象设计原则

    面向对象设计原则是OOPS(Object-Oriented Programming System,面向对象的程序设计系统)编程的核心,但大多数Java程序员追逐像Singleton.Decorator ...

  9. 程序员必修的课---面向对象

    面向对象设计原则是OOPS(Object-Oriented Programming System,面向对象的程序设计系统)编程的核心,但大多数Java程序员追逐像Singleton.Decorator ...

最新文章

  1. Gluster的搭建和使用
  2. NLP的一些学习资料
  3. C语言再学习 -- 标识符
  4. 字符串操作(拷贝,比较,拼接等函数)
  5. 【数据结构与算法】之链表的操作和使用
  6. 一些linux知识和http知识
  7. 你的密码已泄露!使用C#阻止弱密码
  8. 马斯克称特斯拉Model Y今年产量有限 明年会大规模生产
  9. Hive大数据-认识Hive知识结构_以及概念介绍---大数据之Hive工作笔记0001
  10. 顶级的CSS和Javascript动画框架推荐
  11. Android 动态调试和JEB启动调试命令
  12. linux内核源码版本查看
  13. 值得收藏的50个学习C语言的源代码网站
  14. ffmpeg系列之编译安卓版ffmpeg库
  15. usb接口多少钱_3分钟搞懂USB
  16. Linux源码安装Mysql5.7
  17. plsql 导入导出数据
  18. 安装3dmax出现:error 1311 找不到源文件
  19. X1Tablet键盘改造成USB键盘
  20. 深入浅出 RPC - 浅出篇

热门文章

  1. c python.h_C++/C语言Python H
  2. 为什么mysql打开闪屏_mysql登录闪屏问题解决办法
  3. 灰度值取值范围_灰度实战(二):Apollo配置中心(2)
  4. java 头尾 队列_源码|jdk源码之栈、队列及ArrayDeque分析
  5. 9月20华为鸿蒙,荣耀先行!华为智慧屏9月发布:搭鸿蒙系统和自研芯片
  6. c语言windows程序设计 - 第十天,C语言Windows程序设计 - 第十天 - 响应键盘事件...
  7. FPGA的设计艺术(2)FPGA开发流程
  8. 数字集成电路的层次关系
  9. 自学web前端的方法都有哪些?新手怎么学HTML5
  10. SQL数据库学习之路(九)