您的位置:首页 > 编程语言 > Java开发

面向对象设计原则

2016-08-25 20:07 281 查看
在使用面向对象思想进行系统设计时,总结出了若干面向对象设计原则,分别是:单一职责原则、开闭原则、里氏替代原则、依赖注入原则、接口分离原则、迪米特原则和组合/聚合复用原则。这些原则是面向对象设计的基石,坚持这些原则是增强系统扩展性、降低耦合性的重要保证。 下面介绍单一职能原则。

单一职能原则

一、定义

单一职责原则(SRP),英文全称是Single Responsibility Principle,该原则的思想是:系统中的每一个类都应该只有一个单独的职责,而所有类所关注的就是自身职责的完成。

SRP中,把职责定义为“变化的原因”。如果你能想到多个原因去改变一个类,那么这个类就具有多于一个的职责。

二、好处

其实单一职责原则的意思就是开发人员经常说的“高内聚、低耦合”。也就是说,每个类应该只有一个职责,对外只能提供一种功能,而引起类变化的原因应该只有一个。

如果一个类有一个以上的职责,这些职责就耦合在了一起,当一个职责发生变化时,可能会影响其它的职责。另外,多个职责耦合在一起,会影响复用性,我们可能只需要复用该类的某一个职责,但这个职责跟其它职责耦合在了一起,很难分离出来。

单一职责原则简单而直观,但在实际应用中很难实现。SRP中,把职责定义为“变化的原因”,这里说的“变化的原因”,只有实际发生时才有意义。可能预测到会有多个原因引起这个类的变化,但rug仅仅是预测,并没有真的发生,这个类仍可看做具有单一职责,不需要分离职责。如果分离,会带来不必要的复杂性。

单一职责原则的尺度如何掌握,是不是应该百分之百的做到呢?原则还是需求导向,即需求决定设计。实际操作中,类设计时的职责划分和类粒度的确定不是一件很简单的事情,需要设计者经验的积累和对需求的仔细分析。

三、总结

众所周知,面向对象编程语言可以提高程序的封装性、复用性、可维护性,但仅仅是“可以”。能不能实现OOPL的这些优点,要看具体怎么做。如果一个类的代码非常混乱,各种功能的代码都混在一起,封装性、复用性、可维护性无从谈起。

SRP是所有原则中最简单的,也是最基本的一个。运用这个原则,可以提高类的内聚性,有助于充分发挥面向对象编程语言的优势。
开闭原则

一、定义

开闭原则(OCP),英文全称是Open for extention, Closed for modification Principle,即对扩展开放,对修改关闭原则。该原则的思想是,可以通过扩展来满足变化,而不需要修改代码,或者说在设计一个模块的时候,应当使这个模块可以在不被修改的前提下被扩展。

二、实现

实现开闭原则的关键是抽象,抽象是面向对象设计的一个核心特征。

对一个事物抽象化,实质上是在概括归纳总结它的本质。抽象让我们抓住最最重要的东西,从更高一层去思考,这降低了思考的复杂度,不用同时考虑太多的东西。

定义一个抽象层,只规定功能而不提供实现,实现通过定义具体类来完成。当需求变化时,不是通过修改抽象层来完成,而是通过重新定义抽象层的新实现来完成,即通过扩展来完成。换言之,定义一个一劳永逸的抽象设计层,允许尽可能多的行为在实现层被实现。

这样一来,通过抽象类及接口,规定了具体类的特征作为抽象层,相对稳定,不需修改,从而满足“对修改关闭”;而从抽象类导出的具体类可以改变系统的行为,从而满足“对扩展开放”。

即使无法百分之百的做到“开-闭”原则,但朝这个方向努力,可以显著改善一个系统的结构。另一方面,对于系统的每个部分都肆意地进行抽象也不是一个好主意,应该仅仅对程序中需求频繁变化的部分进行抽象。拒绝不成熟的抽象和抽象本身一样重要。

三、好处

1)通过扩展已有软件系统,可以提供新的行为,以满足对软件的新需求,使变化中的软件系统有一定的适应性和灵活性。

2)已有的软件模块,特别是最重要的抽象层模块不能再修改,这就使变化中的软件系统有一定的稳定性和延续性。

3)这样的系统同时也满足了可复用性与可维护性。

四、总结

实现开闭原则的关键是抽象!抽象层相对稳定,不需修改,需求变化后通过重新定义抽象层的新实现来完成。
里氏替代原则

一、定义

里氏替代原则(LSP),英文全称是Liskov Substitution Principle,Liskov是该替代原则的提出者。该原则的思想是:在任何父类出现的地方都可以用它的子类来替代,而不影响功能。

其实里氏替代原则的意思就是:同一个继承体系中的对象应该有共同的行为特征。里氏代换原则关注的是怎样良好地使用继承,也就是说不要滥用继承,它是继承复用的基石。

二、好处

里氏替代原则是对开闭原则的扩展。如果要采用开闭原则必然用到抽象和多态,而这又离不开继承,里氏替代原则就是对如何良好继承提出了要求。

三、总结

里氏替代原则是对开闭原则的扩展。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  java 面向对象