来源:javarevisited | 收藏到我的网摘
面向对象设计原则是OOPS(Object-Oriented Programming System,面向对象的程序设计系统)编程的核心,但大多数Java程序员追逐像Singleton、Decorator、Observer这样的设计模式,而不重视面向对象的分析和设计。甚至还有经验丰富的Java程序员没有听说过OOPS和SOLID设计原则,他们根本不知道设计原则的好处,也不知道如何依照这些原则来进行编程。
众所周知,Java编程最基本的原则就是要追求高内聚和低耦合的解决方案和代码模块设计。查看Apache和Sun的开放源代码能帮助你发现其他Java设计原则在这些代码中的实际运用。Java Development Kit则遵循以下模式:BorderFactory类中的工厂模式、Runtime类中的单件模式。你可以通过Joshua Bloch的《Effective Java》一书来了解更多信息。我个人偏向的另一种面向对象的设计模式是Kathy Sierra的Head First Design Pattern以及Head First Object Oriented Analysis and Design。
虽然实际案例是学习设计原则或模式的最佳途径,但通过本文的介绍,没有接触过这些原则或还在学习阶段的Java程序员也能够了解这10个面向对象的设计原则。其实每条原则都需要大量的篇幅才能讲清楚,但我会尽力做到言简意赅。
原则1:DRY(Don't repeat yourself)
即不要写重复的代码,而是用“abstraction”类来抽象公有的东西。如果你需要多次用到一个硬编码值,那么可以设为公共常量;如果你要在两个以上的地方使用一个代码块,那么可以将它设为一个独立的方法。SOLID设计原则的优点是易于维护,但要注意,不要滥用,duplicate 不是针对代码,而是针对功能。这意味着,即使用公共代码来验证OrderID和SSN,二者也不会是相同的。使用公共代码来实现两个不同的功能,其实就是近似地把这两个功能永远捆绑到了一起,如果OrderID改变了其格式,SSN验证代码也会中断。因此要慎用这种组合,不要随意捆绑类似但不相关的功能。
原则2:封装变化
在软件领域中唯一不变的就是“Change”,因此封装你认为或猜测未来将发生变化的代码。OOPS设计模式的优点在于易于测试和维护封装的代码。如果你使用Java编码,可以默认私有化变量和方法,并逐步增加访问权限,比如从private到protected和not public。有几种Java设计模式也使用封装,比如Factory设计模式是封装“对象创建”,其灵活性使得之后引进新代码不会对现有的代码造成影响。
原则3:开闭原则
即对扩展开放,对修改关闭。这是另一种非常棒的设计原则,可以防止其他人更改已经测试好的代码。理论上,可以在不修改原有的模块的基础上,扩展功能。这也是开闭原则的宗旨。
原则4:单一职责原则
类被修改的几率很大,因此应该专注于单一的功能。如果你把多个功能放在同一个类中,功能之间就形成了关联,改变其中一个功能,有可能中止另一个功能,这时就需要新一轮的测试来避免可能出现的问题。
原则5:依赖注入或倒置原则
这个设计原则的亮点在于任何被DI框架注入的类很容易用mock对象进行测试和维护,因为对象创建代码集中在框架中,客户端代码也不混乱。有很多方式可以实现依赖倒置,比如像AspectJ等的AOP(Aspect Oriented programming)框架使用的字节码技术,或Spring框架使用的代理等。
原则6:优先利用组合而非继承
如果可能的话,优先利用组合而不是继承。一些人可能会质疑,但我发现,组合比继承灵活得多。组合允许在运行期间通过设置类的属性来改变类的行为,也可以通过使用接口来组合一个类,它提供了更高的灵活性,并可以随时实现。《Effective Java》也推荐此原则。
原则7:里氏代换原则(LSP)
根据该原则,子类必须能够替换掉它们的基类,也就是说使用基类的方法或函数能够顺利地引用子类对象。LSP原则与单一职责原则和接口分离原则密切相关,如果一个类比子类具备更多功能,很有可能某些功能会失效,这就违反了LSP原则。为了遵循该设计原则,派生类或子类必须增强功能。
原则8:接口分离原则
采用多个与特定客户类有关的接口比采用一个通用的涵盖多个业务方法的接口要好。设计接口很棘手,因为一旦释放接口,你就无法在不中断执行的情况下改变它。在Java中,该原则的另一个优势在于,在任何类使用接口之前,接口不利于实现所有的方法,所以单一的功能意味着更少的实现方法。
原则9:针对接口编程,而不是针对实现编程
该原则可以使代码更加灵活,以便可以在任何接口实现中使用。因此,在Java中最好使用变量接口类型、方法返回类型、方法参数类型等。《Effective Java》 和《head first design pattern》书中也有提到。
原则10:委托原则
该原则最典型的例子是Java中的equals() 和 hashCode() 方法。为了平等地比较两个对象,我们用类本身而不是客户端类来做比较。这个设计原则的好处是没有重复的代码,而且很容易对其进行修改。
总之,希望这些面向对象的设计原则能帮助你写出更灵活更好的代码。理论是第一步,更重要的是需要开发者在实践中去运用和体会。
发表评论
-
java 加密解密算法总结(转)
2013-03-19 11:28 837package tianya.cn.main; im ... -
深入了解Struts2返回JSON数据的原理及具体应用范例
2013-03-18 09:40 1197转载自: http://yshjava.iteye.com/ ... -
ICE:slice语言常识整理
2013-01-28 10:53 1751============================== ... -
ICE实例
2013-01-25 17:46 879本文将结合实际项目,做一个基于ice的实际项目实例应用,该实例 ... -
ICE转摘学习
2013-01-25 17:44 795Ice 出自ZeroC名门之 ... -
Google 浏览器css hack 写法
2013-01-16 11:09 749针对Chrome和Safari等Webkit核心浏览器的CS ... -
图片预加载做法
2012-12-18 17:34 798/** * 图片头数据加载就 ... -
js 事件冒泡
2012-11-19 14:40 883JavaScript事件冒泡简介及应用 一、什么是事 ... -
java 访问url获取别人的接口服务
2012-08-09 21:51 0** * 程序中访问http数据接口 ... -
Java IO系统之IO系统类层次关系
2012-08-08 09:13 0流是字节序列的抽象概念。 文件是数据的静态存储形式,而流 ... -
java缓存
2012-08-06 12:47 0JAVA缓存技术 JavaJNICacheL ... -
图片滚动带滚动条
2012-07-25 00:08 821<!DOCTYPE html PUBLIC " ... -
hibernate 使用二级缓存 配置
2012-05-26 23:57 1005配置二级缓存主要有两个步骤。 选择需要使用第三方二级缓存 ... -
spring新的jar包名称,搭建框架列表
2012-04-28 13:12 900For a typical web application y ... -
浅谈Java中的几种随机数
2012-04-20 23:51 528众所周知,随机数是任何一种编程语言最基本的特征之一。而生成随机 ... -
30个图片浏览插件收集(转载)
2012-04-20 21:29 146130个图片浏览插件收集 1、MultiBox ... -
Java中Json格式数据的转换(bean,May和XML等)
2012-04-19 15:13 1190JSON与JAVA数据的转换 关键字: json ja ... -
提升用户体验之道:图片预加载
2012-03-02 23:11 725来自:http://www.36ria.com/4030 随 ... -
Windows基于Apache的svn服务器配置
2012-02-08 14:54 905转载自:http://www.cnblogs.com/blue ... -
开发 servlet
2012-01-04 23:42 555如何开发servlet 1.servlet 接口 s ...
相关推荐
### Java程序员应掌握的10个面向对象设计原则详解 #### 原则1:DRY(Don't Repeat Yourself) **定义与理解:** DRY原则的核心思想是避免重复代码,提高代码复用性。这一原则鼓励开发者通过抽象化公共功能来减少...
随着对基础知识的掌握,程序员会逐渐接触到面向对象设计原则,如单一职责原则(SRP)、开闭原则(OCP)、里氏替换原则(LSP)、接口隔离原则(ISP)和依赖倒置原则(DIP)。这些原则能帮助编写出更健壮、可维护的代码。 接...
### 一个Java程序员应该掌握的10项技能详解 #### 1. 语法 作为Java程序员,必须熟悉Java语言的基本语法。在实际编程过程中,能够根据集成开发环境(IDE)提供的错误提示信息迅速识别出语法错误,并且知道如何进行...
"Java面向对象设计原则" Java面向对象设计原则是OOPS(Object-Oriented Programming System,面向对象的程序设计系统)编程的核心。下面我们将详细介绍七大设计原则。 原则1: DRY(Don't repeat yourself) DRY...
面向对象设计原则是OOPS编程的核心, 但我见过的大多数Java程序员热心于像Singleton (单例) 、 Decorator(装饰器)、Observer(观察者) 等设计模式,而没有把足够多的注意力放在学习面向对象的分析和设计上面。...
以下是你需要了解的10个面向对象设计原则,它们可以帮助你提升编程技能并遵循最佳实践。 1. 单一职责原则(Single Responsibility Principle, SRP) - 每个类应只有一个引起变化的原因。这意味着一个类只负责一项...
对于Java开发,面向对象的设计模式和原则是不可或缺的一部分。《Java程序员宝典》可能详细讲解了单例模式、工厂模式、观察者模式等常见设计模式,以及SOLID原则,这些能够提升代码的可读性和可维护性。 此外,书中...
通过阅读,可以巩固Java语法基础,理解面向对象设计原则。 2. **《Effective Java》**:作者Joshua Bloch的著作,书中列举了23项编程实践中最重要的原则,涵盖了类与对象的设计、泛型、并发、枚举与集合等。学习这...
Java程序员之路是一个涵盖广泛的主题,它涉及到一个人从零基础学习Java编程语言,逐渐掌握核心技术,直至成为精通JSP(Java Server Pages)的专业编程人员的全过程。在这个过程中,开发者需要掌握一系列的技术栈和...
在考试中,可能会考察如何设计和实现符合面向对象原则的类和接口,以及如何利用继承和多态优化代码。 2. 对Java语言概念和细节的精确把握: 要通过Java程序员考试,需要深入理解类、对象、接口、包、异常处理、...
这份资源旨在帮助开发者全面提升其在Java领域的专业素养,包括但不限于编程基础、面向对象设计原则、异常处理、集合框架、多线程、网络编程、数据库操作以及高级特性等。 1. **Java编程基础**:这部分内容将引导...
5. **《设计模式:可复用面向对象软件的基础》**:GOF四人合著的经典之作,介绍了23种设计模式,是理解软件设计原则和模式的重要参考。 6. **《重构:改善既有代码的设计》**:Martin Fowler的名作,讲解如何通过...
"java程序员等级图"具体列出了Java开发者从入门到精通的技能进阶路线,包括基本语法、面向对象编程、异常处理、多线程、集合框架、I/O流、网络编程、JVM原理、Spring框架等。随着等级的提高,开发者需要掌握更复杂的...
总之,Java面向对象程序设计涵盖了从基础语法到高级特性的全面知识,对于想要从事Java开发的程序员来说,这是一个必不可少的学习领域。通过深入理解和实践,开发者能够创建出高效、稳定且易于维护的软件系统。
初学者应该掌握基本语法、面向对象编程概念(如封装、继承和多态)、异常处理、集合框架(如ArrayList、LinkedList、HashMap等)以及I/O流。 其次,理解JVM(Java虚拟机)的工作原理至关重要。Java程序在JVM上运行...
Java面向对象程序设计 Java面向对象程序设计是一本由莫雷利、王尔德合著的图书,出版于2008年 oleh 清华...该书为读者提供了一个系统、全面的Java面向对象程序设计指南,适合国内、Java课程体系的学生和新手程序员。