类的原理

类原理是设计模式的灵魂,当你在找不到适当的设计模式时,可用原理做指导,自己就能找到合适的“路”。<推荐:Robert Martin 的《Design Principles and Design Patterns》一书>

与模式相比,原理处于更高的层次,多数模式依附与一个潜在的原理集。模式可看做是原理的实例,如同HTML与SGML的关系一样。原理可指导你设计和选择最佳模式,它是面向对象设计的核心!

有两类原理:关于类的,和关于包的。前者着眼于类间关系,通常是设计模式的基础;后者着眼于包间关系,是许多体系结构模式的基础(关于体系结构的模式:推荐POSA系列,现在已完备了,共有5卷,再有就是martin flower的企业设计模式 EA。J2ee设计模式),这里主要给出类原理:

所有的原理都是为了:弹性的系统。    重用,易扩充,易修改,易替换。

1.ocp(open closed principle首字缩写)——开放封闭原理:对象类应该是开放的以便于扩展,又要是封闭的以利于修改。   该原理是类原理的始祖,所有其它原理都可从它演化。此原理源于Bertrand Meyer的著作【OOSC97】。原理指出:我们应该在不改动原有类的基础上就能够向系统中增加新的功能。OCP中的一个原则就是减少类间的耦合,在抽象层次上建立类间的关联,不要在两个具体的类间建立关系,而在具体类和抽象类(接口)间建立关系。

2.LSP(Liskov Substitution Principle)——Liskov替代原理:子类应该可用来替代其基类。该原理可看为OCP的补充。 该原理由Barbara Liskov 从Bertrand Meyer的契约式设计演化而来(Desgin by Contract 简称DBC) 对设计的指导:重写基类方法时,子类不可以抛出比父类同名方法更多,更抽象的异常。为了达到可替换的目的必须满足:子类中方法的前置条件不能强于父类,后置条件不能弱于父类(如果不将可替换性考虑在内,亦可不必理会)。

3.DIP(Dependency Inversion Principle)——依赖性倒置:依赖于抽象类,不要依赖于具体类。      该原理告诉我们如何遵从ocp,如果ocp是目标的话,dip就是达到目标的方法。 该原理鼓励我们多使用接口,或一些抽象类。常见的范例:

A:SomeAncester sa =((Someancester)(Class.forName("SomeDescendentType"))).newInstance();然后调用sa的某方法。因为引用是一个基类型,根据Lsp原理,子类对象实例完全可以赋给基类引用。用这种方式加载对象可方便的替换子类 ————仅替换类名即可[甚至可从某配置文件中获取类名].缺点是类名易写错,导致运行时异常。无法给构造方法传递参数。

B:抽象耦合:一个类不要与另一个具体的类耦合,即不能与可实例化的类耦合。类应该与基类或抽象类(接口)耦合

C:工厂对象(23种设计模式之一)。由另一个类来负责创建对象实例,而返回的类型是抽象型。使用者均使用此抽象的引用。虽然它违背了dip原理(由于工厂对象会直接使用具体类),但它是精心的违背,仍可接受,是舍己从人,为了其他部分更好的尊从dip,且将易变部分局部化于工厂对象的内部了。跟据关注点分离宗旨,识别系统中稳定部分与经常变化的部分是很重要的。不必要在稳定的部分引入间接层。

4.ISP(Interface separation Principle)------ 接口分离原理:多个专用接口优于一个单一的通用接口。    就是指接口应具有高内聚性,不相关的接口,勿牵强放在一起,这样只会给实现者增加负担。应使接口具有单一的角色。如:为数据源访问者提供一个兼具 CRUD(Create,Read,Update,Delete)性质的接口,不如将其合理分开。了解并非所有的访问者都使用这些功能(有的仅仅是为了读),这样实现者也不用去实现一个庞然大物,而其仅有个别功能被使用。

5.CRP(Composite Reuse Principle)——构成重用原理:对象构成物的多态性优于继承。      一种灾难性的错误就是将继承作为重用的主要机制。crp在Gof95中首先提出。继承是一种在特殊性中概括出一般性的关系,即类树中级别高的类是所派生类的一种概括性版本,基类总需要定义一组缺省的特性,这些特性必须能够应用于从它派生出的任何类。任何时候出现必须对基类所定义的缺省行为进行覆写(overWrite)时,就说明基类不是一个很好的概括,基类中的缺省行为必须保证它适用于所有的派生类。考虑两个问题:

A:某操作究竟是放在基类中还是应该下放到子类中。放在基类中会不会导致子类出现空实现(方法的实现是空语句),即子类根本就不支持此方法。(算法空对象:一个类实现了某接口但对接口中所定义方法的实现是空语句)。

B:成员方法与成员接口的选择。什么时候成员接口比方法更合适?

6.PLK(Principle of Least Knowledge)-------最少知识原理,亦称Demeter(迪米特)法则:在一个类上的操作中,只有类本身,操作的参数对象,操作中创建的对象和类包含的实例对象等的操作可被调用。    

基本思想:避免调用那些调用其他对象的方法所返回的对象上的任何方法。plk建议:尽量调用所包含的对象上的方法,而不要获取其他对象的引用,但可以通过所包含对象把调用的请求传递给原来我们需要获得的对象。优点:不需要了解被调用方法的对象的任何内部组成部分。不足之处是,不得不创建许多方法用来把调用传递给内部对象,致使出现巨大而笨重的接口。(灵活)折中做法:任何需要返回对象引用时,都要保证返回的是接口类型(让使用者依赖抽象!)。               该思想与互联网的路由思想异曲同工:只需要知道邻居结点的路由信息(最少),不需要知道其他。

你可能感兴趣的:(设计模式,数据结构,算法,互联网,企业应用)