java面向对象程序设计_Java程序员的10个面向对象设计原则

java面向对象程序设计html

面向对象的设计原则是OOPS编程的核心,可是我看到大多数Java程序员都在追求诸如 Singleton模式Decorator模式Observer模式之类的设计模式,但没有对 面向对象的分析和设计给予足够的重视,也没有遵循这些设计原则。 我常常见过各类经验水平的Java程序员和开发人员,他们要么没有据说过这些 OOPSSOLID设计原理,要么根本不知道 特定设计原理能够提供什么 好处,或者如何在编码中使用这些设计原理。
最重要的是,始终努力实现具备高度凝聚力和松散耦合的解决方案,代码或设计,而且看起来来自Apache和Sun的开源代码是Java设计原理的很好示例,或者在Java编码中应如何使用设计原理。 Java开发工具包遵循几种设计原则,例如BorderFactory类中的 Factory Pattern ,Runtime类中的Singleton模式,若是您对Java代码有更多兴趣,请阅读 Joshua Bloch撰写的 Effective Java ,这是编写Java API的人的宝藏。 在面向对象设计模式上我另外一个我的的最爱是Kathy Sierra等人的 Head First Design PatternHead First Oriented Oriented Analysis and Design
尽管学习设计原理或模式的最佳方法是在现实世界中了解并理解违反该设计原理的后果,可是本文的主题是为未接触过或处于学习阶段的Java程序员介绍 面向对象的设计原理 。 我我的认为每一个设计原则都须要一篇文章来清楚地解释它,我确定会在这里尝试作,可是如今就让本身准备好在设计原则之乡快速骑自行车吧:)
面向对象的设计原则1 – DRY(请勿重复)
顾名思义, DRY(不要重复本身)意味着不要编写重复的代码,而应使用 抽象技术在一处抽象公共事物。 若是您屡次使用硬编码值,请考虑使其成为公共最终常量;若是您在两个以上的位置中包含代码块,请考虑使其成为单独的方法。 这种SOLID设计原则的好处在于维护。 值得注意的是不要滥用它,重复不是用于代码,而是用于功能,这意味着若是您使用通用代码来验证OrderID和SSN,这并不意味着它们相同或未来会保持不变。 经过将通用代码用于两种不一样的功能或事物,您能够将它们永久紧密地结合在一块儿,而且当OrderID更改其格式时,SSN验证代码将中断。 所以,请注意这种耦合,不要将任何使用类似代码但不相关的东西组合在一块儿。
面向对象的设计原则2 –封装变化
在软件领域只有一件事是不变的,那就是“更改”。所以,封装您指望或怀疑未来会更改的代码。 这种OOPS设计原则的好处在于,它易于测试和维护正确的封装代码。 若是您使用Java进行编码,则遵循如下原则:默认状况下将变量和方法设为私有,并逐步增长访问权限,例如,从私有到受保护,而不是公共。 Java中有几种 设计模式都使用了封装, 工厂设计模式是封装的一个示例,它封装了对象建立代码,并提供了之后引入新产品的灵活性,而不会影响现有代码。
面向对象的设计原则3 –开放封闭原则
类,方法或函数应为扩展打开(新功能),并为修改关闭。 这是另外一种漂亮的面向对象的设计原则,能够防止有人更改已经尝试和测试过的代码。 理想状况下,若是仅添加新功能,则不该测试代码,这就是 开放式封闭设计原则的目标。
面向对象的设计原则4 –单一职责原则(SRP)
类更改的缘由不该多于一个,或者一类应始终处理单个功能。 若是您 在Java的一个 类中放置了多个功能,则会在两个功能之间引入 耦合 ,即便您更改了一个功能,也有可能破坏了耦合功能,这须要进行另外一轮测试,以避免对生产环境形成任何意外。
面向对象的设计原则5 –依赖注入或反转原则
不要要求依赖,它将由框架提供给您。 这已经在Spring框架中很好地实现了,该 设计原理的优势在于,DI框架注入的任何类都易于使用模拟对象进行测试,而且易于维护,由于对象建立代码集中在框架中,而且客户端代码不会乱扔垃圾有多种方法能够实现 依赖注入,例如使用某些AOP(面向方面​​的编程)框架(如AspectJ)所使用的字节码工具,或像Spring中所使用的代理同样来实现 依赖注入
面向对象的设计原则6 –优先继承而不是继承
若是可能的话,始终 主张使用组合而不是继承 。 大家中的有些人可能会争论这一点,但我发现Composition比Inheritance灵活得多。 组合容许经过在运行时设置属性并使用接口来构成一个类,从而在运行时更改类的行为,咱们使用 多态性 ,该 多态性能够随时替换以更好的实现。 即便是 有效的Java建议也建议使用组合而不是继承。
面向对象的设计原则7 – Liskov替代原则(LSP)
根据Liskov替换原理,子类型必须能够替代父类型,即便用父类类型的方法或函数必须可以与子类的对象一块儿工做而不会出现任何问题。 LSP与 单一职责原则接口隔离原则密切相关。 若是一个类具备比子类更多的功能,则可能不支持某些功能而且确实违反了LSP。 为了遵循 LSP设计原则 ,派生类或子类必须加强功能而不减小它。
面向对象的设计原则8 –接口隔离原则(ISP)
接口隔离原则规定,若是客户端不使用接口,则不该实现该接口。 这种状况一般发生在一个接口包含多个功能而客户端只须要一个功能而不是其余功能的状况下。接口设计是一项棘手的工做,由于一旦释放接口,就没法在不破坏全部实现的状况下对其进行更改。 Java中这种设计原则的另外一个好处是,接口在任何类均可以使用它以前就没法实现全部方法,所以具备单一功能意味着实现的方法更少。
面向对象的设计原则9 –接口编程不实现
始终 为接口而不是为实现编程,这将致使能够与任何新的接口实现一块儿使用的灵活代码。 所以,在Java中对变量使用接口类型,方法的返回类型或方法的参数类型。 许多Java程序员都建议使用此方法,包括在 Effective Java优先设计模式手册中。
面向对象设计原则10 –委托原则
不要本身作全部事情,而是将其委托给各自的班级。 委托设计原理的经典示例是 Java中的equals()和hashCode()方法 。 为了比较两个对象是否相等,咱们要求类自己进行比较,而不是由Client类进行比较。 这种设计原则的好处是不会重复代码,而且很容易修改行为。
全部这些 面向对象的设计原理都经过争取高内聚性和低耦合性来帮助您编写灵活,更好的代码。 理论是第一步,但最重要的是 发展能力,以找出什么时候以及应用这些设计原则,并肯定咱们是否违反任何设计原则并损害代码的灵活性。 可是,因为这个世界上没有什么是完美的,因此不要老是尝试用 设计模式和设计原理来解决问题,它们主要用于维护周期较长的大型企业项目。

翻译自: https://www.javacodegeeks.com/2012/08/10-object-oriented-design-principles.htmljava

java面向对象程序设计node