`
Acea
  • 浏览: 15213 次
  • 性别: Icon_minigender_1
  • 来自: 上海
最近访客 更多访客>>
社区版块
存档分类
最新评论
阅读更多
类原理是设计模式的灵魂,当你在找不到适当的设计模式时,可用原理做指导,自己就能找到合适的“路”。<推荐: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建议:尽量调用所包含的对象上的方法,而不要获取其他对象的引用,但可以通过所包含对象把调用的请求传递给原来我们需要获得的对象。优点:不需要了解被调用方法的对象的任何内部组成部分。不足之处是,不得不创建许多方法用来把调用传递给内部对象,致使出现巨大而笨重的接口。(灵活)折中做法:任何需要返回对象引用时,都要保证返回的是接口类型(让使用者依赖抽象!)。               该思想与互联网的路由思想异曲同工:只需要知道邻居结点的路由信息(最少),不需要知道其他。
分享到:
评论

相关推荐

    各种泵类风机类原理图.rar

    各种泵类风机类原理图rar,各种泵类风机类原理图

    Java集合类原理详解.pdf

    Java集合类原理详解.pdf

    制动系统-各种阀类原理介绍.pdf

    制动系统-各种阀类原理介绍.pdf

    java集合类原理面试题

    java集合类 Java中有哪些容器(集合类)? 线程安全和线程不安全的分别有哪些? Map接口有哪些实现类? 描述一下Map put的过程 如何得到一个线程安全的Map? HashMap有什么特点? ConcurrentHashMap是怎么分段分组...

    Java匿名内部类原理与用法详解

    主要介绍了Java匿名内部类原理与用法,结合实例形式分析了Java匿名内部类的概念、原理、应用与相关操作注意事项,需要的朋友可以参考下

    Java内部类原理、概述与用法实例详解

    主要介绍了Java内部类原理、概述与用法,结合实例形式详细分析了Java内部类的相关概念、原理、访问、调用方法等操作技巧与注意事项,需要的朋友可以参考下

    Java局部内部类原理与用法实例分析

    主要介绍了Java局部内部类原理与用法,结合实例形式分析了Java局部内部类功能、用法及相关操作注意事项,需要的朋友可以参考下

    Java日期与时间类原理解析

    主要介绍了Java日期与时间类原理解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下

    Java Objects工具类原理及用法详解

    主要介绍了Java Objects工具类原理及用法详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下

    Java 的抽象类原理与用法分析

    主要介绍了Java 的抽象类原理与用法,结合实例形式分析了java抽象类与接口的相关概念、原理、使用方法及操作注意事项,需要的朋友可以参考下

    Java接口和抽象类原理详解

    主要介绍了Java接口和抽象类原理详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下

    PHP 自动加载类原理与用法实例分析

    本文实例讲述了PHP 自动加载类原理与用法。分享给大家供大家参考,具体如下: 类的自动加载 (Autoloading Classes) 在编写面向对象(OOP) 程序时,很多开发者为每个类新建一个 PHP 文件。 这会带来一个烦恼:每个...

    Mihoks#Java-Concurrent-Notes#2-2-继承Thread类原理1

    * Thread类中的run方法内部的任务并不是我们所需要的,既然thread类已经定义了线程任务的位置只要重写run方法定义任务的代码即可.* 多线程执行时,

    java类加载原理分析

    java类加载原理分析,引导类加载器,扩展类加载器,系统类加载器(也叫应用类加载器)

    Java StringBuilder类原理及常用方法

    主要介绍了Java StringBuilder类原理及常用方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下

    Java Calendar日历类原理及使用方法

    主要介绍了Java Calendar日历类原理及使用方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下

    Java基本数据类型包装类原理解析

    主要介绍了Java基本数据类型包装类原理解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下

    D类功放原理

    d类功率放大器原理以及应用,D类功放是放大元件处于开关工作状态的一种放大模式。无信号输入时放大器处于截止状态,不耗电。工作时,靠输入信号让晶体管进入饱和状态,晶体管相当于一个接通的开关,把电源与负载直接...

    D类功放制作原理图

    D类功放制作原理图。基于protel绘制。需要的拿去。

    Java动态代理语法Proxy类原理详解

    主要介绍了Java动态代理语法Proxy类原理详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下

Global site tag (gtag.js) - Google Analytics