设计模式(Design Pattern)是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结,使用设计模式是为了可重用代码、让代码更容易被他人理解并且保证代码可靠性。

创建型模式主要用于描述如何创建对象;
结构型模式主要用于描述如何实现类或对象的组合;
行为型模式主要用于描述类或对象怎样交互以及怎样分配职责

基本设计原则

面向对象设计原则为支持可维护性复用而诞生,这些原则蕴含在很多设计模式中,它们是从许多设计方案中总结出的指导性原则。7种常用的面向对象设计原则: Overview - 图1

单一职责原则(SRP)

Single Responsibility Principle
一个类只负责一个功能领域中的相应职责。 一些基本指导原则:

  • 两个完全不一样的功能不应该放一个类中
  • 一个类中应该是一组相关性很高的函数、数据的封装
  • 应该不断审视自己的代码,根据具体业务、功能对类进行拆分,优化代码

开闭原则(OCP)

Open-Closed Principle
对扩展开放,对修改关闭

里氏代换原则(LSP)

Liskov Substitution Principle
所有引用基类的地方,必须能够使用其子类直接替换。 这个原则与面向对象的继承特性密切相关:

  • 子类必须实现父类的所有方法 (继承的特性,子类拥有父类的所有方法)
  • 子类可以有自己的个性 (重写)
  • 覆盖或实现父类的方法时,入参可以放大(如:父类的参数 HashMap , 子类参数可以为 Map); 输出可以被缩小(如父类 return Map, 子类 return HashMap

依赖倒转原则(DIP)

Dependence Inversion Principle
抽象不应该依赖于细节,细节应该依赖于抽象

接口隔离原则(ISP)

Interface Segregation Principle
使用多个专门的接口,而不使用单一的总接口
客户端不应该依赖它不需要的接口。(此处接口分为实例接口即类,类接口 interface,所以此处的接口在 java 中是类和接口的意思)
建立单一的接口,不要建立臃肿庞大的接口,与 SRP 的区别:SRP 针对职责,从业务逻辑划分;ISP 是要求接口的方法尽量少。

  1. 接口尽量小
  2. 接口要高内聚。高内聚:提高接口、类、模块的处理能力,减少对外的交互,要求在接口中尽少公布 public 方法,减少对外承诺也有利于降低成本
  3. 定制服务,针对不同的用户提供优良的服务,只提供访问者需要的方法。如不同权限的用户给于不同的操作接口。
  4. 接口设计有限度的。接口粒度越小,越灵活,但是结构却越复杂,所以要有个度

合成复用原则(CRP)

Composite Reuse Principle
尽量使用对象组合,而不是继承来达到复用的目的

迪米特原则(LoD)

Law of Demeter
也称为最少知识原则(Least Knowledge Principle,LKP):「一个对象应该对其他对象有最少的了解。对类的低耦合提出了明确的要求」

  1. 只和朋友交流。例:老师叫班长清点学生,老师应该只和班长有耦合,而不应该和学生有耦合。
  2. 朋友之间也是有距离的。耦合的类不要把太多方法暴露给其它类,否则改动要修改的地方太多。(高内聚)
  3. 自己的就是自己的。如果一个方法放在本类中,既不增加类间关系,也对本类不产生负面影响,那就放置在本类中。

Overview - 图2

参考