面向对象设计根本的指导原则是提高可维护性和可复用性。这些原则主要有:1. 开闭原则;2. 依赖倒转原则;3. 里氏代换原则;4.
合成/聚合复用原则;5. 迪米特原则;6. 接口隔离原则
所有的设计模式都是对不同的可变性的封装,从而使系统在不同角度达到“开闭原则”的要求。
在软件软件系统中,一个模块设计得好不好的最主要、最重要的标志,就是该模块在多大程度上将自己的内部数据和其他与实现有关的细节隐藏起来。一
个设计得好的模块可以将它所有的实现细节隐藏起来,彻底地将提供给外界的API和自己的实现分隔开来。这样一来,模块与模块之间就可以仅仅通过彼此的
API相互通信,而不理会模块内部的工作细节。
面向对象设计根本的指导原则是提高可维护性和可复用性。这些原则主要有:
1. 开闭原则
一个软件实体应该对扩展开放,对修改关闭。
在设计一个模块的时候,就当使这个模块可以在不被修改的前提下被扩展。换言之,就当可以在不必修改源代码的情况下改变这个模块的行为。
如何做到既不修改,又可以扩展?
解决问题的关键在于抽象化:在Java语言里,可以给出一个或多个抽象Java类或Java接口,规定出所有的具体类必须提供的方法特征作为系
统设计的抽象层。这个抽象层预见了所有的可能扩展,因此,在任何扩展情况下都不会改变。这就使得系统的抽象层不需要修改,从而满足了—对修改关闭。
同时,由于从抽象层导出一个或多个新的具体类可以改变系统的行为,因此系统的设计对扩展是开放的。
开闭原则实际上是对“对可变性的封闭原则“:找到一个系统的可变因素,将之封装起来。这个原则意昧着两点:
1) 一个可变性不应当散落在代码的很多角落里,而应当被封装到一个对象里面。同一种可变性的不同表象意昧着同一个继承等级结构中的具体子类。
继承就当被看作是封装变化的方法,而不应当被认为是从一般的对象生成特殊对象的方法。
2) 一种可变性不应当与另一种可变性混合在一起。(所有类图的继承结构一般不会超过两层,不然就意昧着将两种不同的可变性混合在了一起。)
开闭原则是总的原则,其它几条是开闭原则的手段和工具。
2. 依赖倒转原则
依赖倒转原则讲的是:要依赖于抽象,不要信赖于实现。
开闭原则是目标,而达到这一目标的手段是依赖倒转原则。
抽象层次包含的是应用系统的商务逻辑和宏观的、对整个系统来说重要的战略性决定,是必然性的体现;而具体层次则含有一些次要的与实现有关的算法
和逻辑,以及战术性的决定,带有相当大的偶然性选择。具体层次的代码是会经常有变动的,不能避免出现错误。
抽象层次含有一个应用系统最重要的宏观商务逻辑,是做战略判断和决定的地方,那么抽象层次就应当是较为稳定的,应当是复用的重点;也应当是维护
的重点。
在很多情况下,一个Java程序需要引用一个对象。这个时候,如果这个对象有一个抽象类型的话,应当使用这个抽象类型作为变量的静态类型。这就
是针对接口编程的含义。
一般而言,在创建一个对象时,Java语言要求使用new关键词以及这个类本身。而一旦这个对象已经被创建出来,那么就可以灵活地使用这个对象
的抽象类型来引用它。比如:List employees = new
Vector();因此,Java语言中创建一个对象的过程是违背“开闭原则”以及依赖倒转原则的(因为先生成了具体的类型,再使用抽象的引用),虽然在
这个类被创建出来以后,可以通过多态性使得客户端依赖于其抽象类型。正是由于这个问题,设计模式给出了多个创建模式,特别是几个工厂模式,用于解决对象创
建过程中的依赖倒转问题。
工厂模式将创建一个类的实例的过程封装起来,消费这个实例的客户端仅仅取得实例化的结果,以及这个实例的抽象类型。当然,任何方法都无法回避
Java语言所要求的new关键字和直接调用具体类的构造子的做法(这违背了里氏代换原则)。简单工厂模式将这个违反“开闭原则”和依赖倒转原则的做法封
装到了一个类里面,而工厂方法模式将这个违反原则的做法推迟到了具体工厂角色中。通过适当的封装,工厂模式可以净化大部分的结构,而将违反原则的做法孤立
到易于控制的地方。
联合使用Java接口和Java抽象类:声明类型的工作由Java接口承担,但是同时给出的还有一个Java抽象类,为这个接口给出一个缺省实
现。如果一个具体类直接实现这个Java接口的话,它就必须自行实现所有的接口;相反,如果它继承自抽象类的话,它就可以省去一些不必要的方法,因为它可
以从抽象类中自动得到这些方法的缺省实现。这其实就是缺省适配模式。
依赖倒转的缺点:
1)
因为依赖倒转的缘故,对象的创建很可能要使用对象工厂,以避免对具体类的直接引用,此原则的使用还会导致大量的类。对不熟悉面向对象技术的工程师来说,维
护这样的系统需要较好地面向对象的设计知识。
2)
依赖倒转原则假定所有的具体类都是会变化的,这也不总是正确的。有一些具体类可能相当稳定、不会发生变化,消费这个具体类实例的客户端完全可以依赖这个具
体类型,而不必为此发明一个抽象类型。
3. 里氏代换原则
任何基类可以出现的地方,子类一定可以出现。
开闭原则的关键步骤是抽象化。而基类与子类的继承关系就是抽象化的具体体现,里氏代换原则是对实现抽象化的具体步骤的规范。
4. 合成/聚合复用原则
要尽量使用合成/聚合,而不是继承关系达到复用的目的。
合成/聚合原则要求我们首先考虑合成/聚合关系,里氏代换原则要求在使用继承时,必须确定这个继承关系符合一定的条件(继承是用来封装变化的;
任何基类可以出现的地方,子类一定可以出现。)
合成/聚合原则就是在一个新的对象里面使用一些已有的对象,使之成为新对象的一部分;新的对象通过向这些对象的委派达到得复用已有功能的目的。
5. 迪米特原则
一个软件实体应当尽可能少的其他实体发生相互作用。模块之间的交互要少。这样做的结果是当系统的功能需要扩展时,会相对更容易地做到对修改的关
闭。
一个对象应当对其他对象有尽可能少的了解。
迪米特原则的具体操作:
1) 优先考虑将一个类设置成不变类。不变类易于设计、实现和使用。比如Java API中的String,BigInteger等类。
一个对象与外界的通信大体上分成两种,一种是改变这个对象的状态,另一种是不改变这个对象的状态的。如果一个对象的内部状态根本就是不可能改变
的,那么它与外界的通信当然就大大地减少。
当涉及任何一个类的时候,都首先考虑这个类的状态是否需要改变。即便一个类必须是可变类,在给它的属性设置赋值方法的时候,也要保持吝啬的态
度。除非真的需要,否则不要为一个属性设置赋值方法。
2) 尽量降低一个类的访问权限。
3)
谨慎使用Serializable,一旦将一个类设置成Serializable,就不能再在新版本中修改这个类的内部结构,包括private的方法和
句段。
4) 尽量降低成员的访问权限。
6. 接口隔离原则
应当为客户端提供尽可能小的单独接口,而不要提供大的总接口。也即是使用多个专门的接口比使用单一的总接口要好。
接口隔离原则与迪米特都是对一个软件实体与其他的软件实体的通信限制。迪米特原则要求尽可能地限制通信的宽度和深度,接品隔离原则要求通信的宽
度尽可能地窄。这样做的结果使一个软件系统在功能扩展过程当中,不会将修改的压力传递到其他对象。
一个接口相当于剧本中的一种角色,而此角色在一个舞台上由哪一个演员来演则相当于接口的实现。因此,一个接口应当简单地代表一个角色,而不是多
个角色。如果系统涉及到多个角色的话,那么每一个角色都应当由一个特定的接口代表。
定制服务:如果客户端仅仅需要某一些方法的话,那么就应当向客户端提供这些需要的方法,而不要提供不需要的方法。(向客户端提供public接
口是一种承诺,没有必要做出不必要的承诺,过多的承诺会给系统的维护造成不必要的负担。)
分享到:
相关推荐
通信传输线路设计基础学习教案.pptx
人工智能程序设计基础学习 第1章 人工智能概述 基本内容及特点产生与发展
ProtelDXP印制电路板设计基础学习课程.pptx
MOS管模拟集成电路设计基础学习教案.pptx
了解java语言产生的历史和工作原理,掌握java语言作为一门面向对象编程语言的基本编程思路,初步接触java程序的两种方式:java application和java applet,掌握java程序的结构、编程规范,学习阅读java帮助文档,并...
《机械设计基础习题答案(全)》是杨可桢等专家编著的一部学习资料,专门针对机械设计基础课程的习题解答。...每一章的文档都是一个独立的知识点集合,共同构建了一个全面的机械设计基础学习体系。
基于EDA技术的设计基础资料是学习硬件设计的必备知识。 在学习EDA技术时,需要掌握 QuartusII 应用简介。QuartusII是 Altera 公司开发的一款EDA软件,广泛应用于FPGA设计、ASIC设计和系统芯片设计等领域。通过学习...
2021年09月16日
c语言程序设计学习指导答案
《数字集成电路设计基础(VLSI设计基础)》是东南大学提供的一门深入探讨集成电路设计的课程,适合集成电路专业的本科生和研究生,以及对这一领域感兴趣的从业者。这门课程旨在为学习者提供扎实的理论基础和实践技能...
第 3 章 面向对象程序设计基础 第 4 章 图形用户界面设计 第 5 章 Java swing基础 第 6 章 Java图形与数字图像处理 第7章 多线程与异常处理 第8章 输入输出流 第9章 网络通信 第10章Java数据库连接 第11章常见...
通过这份《机械设计基础》第五版的课后答案,学习者可以对每个章节的重要概念、公式推导、计算方法和工程应用有更深入的掌握。同时,答案的详细解释有助于解决学习过程中遇到的疑惑,提高自主学习的能力。在实际工程...
《嵌入式软件设计基础:基于...《嵌入式软件设计基础:基于ARM Cortex-M3(原书第2版)》适用于高等院校工科各专业嵌入式计算机系统程序设计、C语言程序设计及汇编语言程序设计类本科课程,也可供相关技术人员学习参考。
Python程序设计基础及实践是学习Python编程的关键步骤,尤其对于初学者来说,它提供了一个全面了解这门语言的平台。Python作为一门高级编程语言,以其简洁的语法和强大的功能深受开发者喜爱,广泛应用于Web开发、...
【地基基础设计的基本原理】是建筑工程领域中的关键环节,涉及到建筑物的安全性和稳定性。本课程主要涵盖地基基础设计的...通过系统学习,学生能够理解和掌握地基基础设计的关键要点,为未来从事相关工作打下坚实基础。
《ZEMAX光学设计超级学习手册》是一本深入学习光学设计的专业资料,其素材文件rar压缩包包含了丰富的实例,旨在帮助用户从基础到高级全面掌握ZEMAX软件的应用。ZEMAX是一款强大的光学设计和分析工具,广泛应用于光学...
《深度学习基础——设计下一代机器智能算法》一书,作为东南大学出版社出版的影印版,为我们提供了一个深入理解和实践深度学习的宝贵资源。 该书首先可能会介绍深度学习的基础概念,包括神经网络的基本结构,如输入...
机械设计基础课程的学习可以帮助学生掌握机械设计的基本理论和方法,提高设计的科学性和合理性。 本资源摘要信息提供了机械设计基础专升本习题及答案,涵盖机械设计基础的各个方面,如机构设计、齿轮传动、蜗杆传动...
【数据库课程设计——英语学习助手】是一个综合性的学习平台,旨在提供全面的英语学习支持,包含用户管理、学习工具和数据库管理等多个方面。这个系统具备三种操作模式:游客模式、普通用户模式和管理员模式,以满足...
《机械设计基础1-6章答案》是一份详尽的学习资料,主要针对高等教育出版社出版的《机械设计基础》第五版教材。这份文档包含了从第一章到第六章的所有习题解答,旨在帮助学生深入理解和掌握机械设计的基本概念、原理...