【软件工程】设计模式及原则

设计模式及原则

封面
图:封面

设计模式

什么是设计模式?

设计模式是可以应用于常见问题的通用可重用解决方案
创建软件应用程序是为了满足不断变化和发展的需求。一个成功的应用程序还应该提供一种简单的方法来扩展它以满足不断变化的期望。后面所讲的设计原则,以及后续所学习的设计模式都是为了这个目的:应用于常见问题的通用可重用解决,满足不断变化和发展的需求。

面向对象的设计原则

面向对象的设计原则被称为SOLID。SOLID原则包括单一职责原则、开闭原则、里氏替换原则、接口隔离原则和依赖倒置原则。在设计和开发软件时可以应用这些原则,以便创建易于维护和开发的程序。

单一职责原则

该原则是指软件模块应该只有一个被修改的理由,目的是为了让封装工作达到最佳的状态。

例如常用于Java中类的修改:修改某个类时,需要修改的原因不止一个,而且这个过程常常会影响其他类的修改。每个更改的职责/理由都会增加新的依赖关系,使代码不那么健壮。
e.g. 一个Car类,假设对Car类添加方法来处理增、删、改、查的数据库操作。此时Car不仅会封装逻辑,还会封装数据库操作。使得类的维护和测试更加困难,因为代码是紧密耦合的。
没有遵循单一职责原则增加功能的Car类
图:没有遵循单一职责原则增加功能的Car类
解决方案:创建两个类,一个用于封装Car逻辑(Car),另一个用于负责持久性(CarDao)。
逻辑封装与持久性分离
图:逻辑封装与持久性分离

开闭原则

“模块、类和函数应该对扩展开放,对修改关闭。”

修改某个已完成部分分险和成本往往更大,我们应该在此基础上继续进行建设(通过继承和多态的方式),而不是去修改原本的。~是最重要的设计原则之一,是大多数设计模式的基础。

里氏替换原则

派生类型必须完全可替代其基类型。基于面向对象语言中的子类型多态,派生对象可以用其父类型替换。
简单来说:当类B继承类A时,除添加新的方法完成新增功能P2外,尽量不要重写父类A的方法,也尽量不要重载父类A的方法。此时可以说,类B是类A比较完整的派生对象,父类型可以替换子类型的多态(不同类型实体接口相同)。

接口隔离原则

使用的接口方法满足客户端功能实现最低要求即可。即,“客户端不应该依赖于它所不需要的接口”。

依赖倒置原则

“高级模块不应该依赖低级模块,两者都应该依赖抽象。”
“抽象不应该依赖于细节,细节应该依赖于抽象。”

这个原则的目的就是为了降低耦合,常用的方法是将高级逻辑与低级模块分开。可以尝试让它们都依赖于抽象进而减少二者之间的依赖关系。如此就可以替换或扩展其中任何一个模块而不影响其他模块。

e.g. 以下的vehicle为抽象类
依赖倒置原则的使用
图:依赖倒置原则的使用

Reference

卡马尔米特·辛格(Kamalmeet Singh). Java设计模式及实践 (Java核心技术系列) (Chinese Edition) (Kindle Location 387). Kindle Edition.