笔记|设计
里氏代换原则----LSP
概念:一个软件实体如果使用一个父类的话,那么一定适用于其之类,而且不能觉察出父类和子类的区别。
里氏代换原则是继承复用的基石。只有当衍生类可以替换掉基类,软件单位不会受到影响时,基础类才真正被复用,而衍生类才能在基础类上增加新的行为。
JAVA中的上塑造型既是里氏代换原则的体现。
依赖倒转原则-----DIP
狭义依赖关系。
依赖关系(Dependency)类与类之间的一种连接,依赖总是单向的。一各类依赖于另一各类的定义。一个人(Person)可以买车(Car)和房子(House),Person类依赖于Car类和House类。
一般而言依赖关系在Java中体现为局部变量、方法参数以及对静态方法的调用。换言之,一个类A的某一个局部变量的类型是另一个类B,那么A类就依赖于B类;如果一个方法的参数是另一个类B的实例,那么这个类A就依赖于B类;如果A类调用B类的静态方法,那么A类依赖于B类。
广义的三种依赖关系。这里依赖又称耦合
l 零耦合关系(Nil Coupling)。两个类没有耦合关系。
l 具体耦合关系(Concrete Coupling)。具体性的耦合关系发生在两个具体类(可实例化的)之间,经由一各类对另一个类直接应用造成。
l 抽象耦合关系(Abstract Coupling)。抽象耦合关系发生在一个具体类和一个抽象类(或接口)之间,使两个必须发生关系的的类之间存在最大的灵活性。
依赖倒转原则含义:抽象不应当依赖于细节,细节应当依赖与抽象。
依赖倒转原则要求:要针对接口编程,不要针对实现编程。
针对接口编程的意思是说:应当使用java接口和抽象类进行变量类型的声明、参数类型的声明、返回类型的声明、数据类型的转换等。
要保证这一点:一个具体类应当只实现接口和抽象类中声明的方法,而不应当给出多余的方法。
List employees = new Vector();
其中: List 称变量employees的静态类型。
Vector称变量employees的实际类型。
在很多情况下,一个java程序需要引用一个对象。这个时候,如果这个对象又一个抽象类型的话,应当使用这个对象的抽象类型作为变量的静态类型。------这就是针对接口编程的具体含义。
接口隔离原则----------ISP
含义:使用多个专门的接口要比使用单一的总接口要好!
从客户类角度上看:一个类对另外一个类的依赖性应当是建立在最小的接口之上。
接口的划分直接带来类型的划分。
目标就是不向客户类提供不必要的行为。
合成聚合复用原则--------CARP
关联,聚合、合成。
合成和聚合都是关联的特殊种类。聚合表示“拥有”关系或整体与部分的关系;而合成则是用来表示一种强的多的 “拥有”。在一个合成的关系里,部分和整体的生命周期是一样的。一个合成的新的对象完全用又对其他组成部分的支配权。包括他们的创建和湮灭。组合而成的对象对组成部分的内存分配、内存释放有绝对的责任。
进一步讲。一个合成的多重性不能超过1,换言之,一个合成的关系中,部分对象不能于另一个合成关系对象共享。
合成通常理解为:值的聚合。而聚合则是:引用的聚合。
合成和聚合是将已有的对象纳入到新的对象中,使之成为新对象的一部分,因此新的对象可以调用已由对象的功能。达到复用的目的。
优点:
l 新对象存取成分对象的唯一方法是通过成分对象的接口。
l 这种复用是黑箱复用,隐藏了成分对象的内部细节。
l 这种复用支持包装。
l 这种复用依赖性较小。(耦合度低)
l 每一个新类可以将焦点集中在一个任务上。
l 这种复用可以在运行时动态进行。新对象可以动态引用于成分对象类型的子对象。
缺点就是:
通过这种复用建造的系统通常会有较多的对象需要管理。
“合成聚合复用可以替代继承复用完成任一项功能。”
尽管继承是一种非常重要的手段但是,应当首先考虑合成聚合。
迪米特法则------LoD
又叫最少知识原则:一个对象应当对其他对象尽可能少的理解。
几种表述:
l 至于你直接的朋友们通信。
l 不要跟“陌生人”说话。
l 每一个软件单位对其他单位用有尽可能少的知识,而且局限于那些于本单位密切相关的软件单位。
关于“朋友”的约定:
l 当前对象本身(THIS)。
l 以参数形式传入到当前对象方法中的对象。
l 当前对象的实例变量直接引用的对象。
l 当前对象的实例变量如果是个聚集那么聚集中的元素也是“朋友”。
l 当前对象创建的对象。
广义迪米特法则
软件系统中,一个模块设计的好不好最主要、最重要的标志,就是该模块在多大程度上将自己的内部数据和其他实现细节隐藏起来。一个设计好的模块可以将它所有的实现细节隐藏起来,很彻底的将提供给外界的API和自己的实现分离开来。这样一来模块于模块之间的通信仅仅通过彼此的API,而不理会模块内部的工作细节。这便是:“信息的隐藏”—“封装”。
广义迪米特法则要求:
l 在类的划分上,应当创建弱耦合的类。类之间的耦合性越低,越有利于复用。
l 在类的设计结构上,每一个类都应尽可能的降低成员的访问权限。
l 在类的设计上,只要有可能一个类应当设计成不变类。(final)。
l 在对其他类的引用上,各对象对其他对象的引用应降到最低。
《java与模式》读书笔记 ----模式设计的原则
80酷酷网 80kuku.com