跳到主要内容

Design Principles

设计模式中主要有六大设计原则,简称为 SOLID,是由于各个原则的首字母简称合并而来的,六大设计原则分别如下:

  1. 单一职责原则(Single Responsibility Principle)
  2. 开闭原则(Open Close Principle)
  3. 里氏替换原则(Liskov Substitution Principle)
  4. 接口隔离原则(Interface Segregation Principle)
  5. 依赖倒置原则(Dependency Inversion Principle)
  6. 迪米特法则(Least Knowledge Principle)

1. Single Responsibility Principle (SRP)

一个类或一个模块只负责完成一个职责(或者功能)。也就是说在类的设计中,不要设计大而全的类,而是要设计粒度小、功能单一的类。

在一个社交媒体产品中,使用 UserInfo 去记录用户的信息,包括如下的属性.

如何判断一个类的职责是否单一?

  1. 类当中的代码行数、函数或者属性过多。
  2. 类依赖的其它的类过多。
  3. 私有方法过多。
  4. 类中的大量的方法总是操作类中的几个属性。

2. Open/Closed Principle (OCP)

在面向对象编程领域中,开闭原则规定软件中的对象、类、模块和函数对扩展应该是开放的,但对于修改是封闭的。这意味着应该用抽象定义结构,用具体的实现扩展细节,以此确保软件系统开发和维护过程的可靠性。

  1. 新老逻辑解耦,需求发生变化不会影响老业务的逻辑。
  2. 改动成本最小,只需要追加新逻辑,不需要改老逻辑。
  3. 提供代码的稳定性和可扩展性。

开闭原则是所有设计模式的最核心的目标。

顶层的设计思维

  1. 抽象意识
  2. 封装意识
  3. 扩展意识

3. Liskov Substitution Principle (LSP)

如果 S 是 T 的子类型,对于 S 类型的任何对象,如果将他们看作是 T 类型的对象,则对象的行为也理应与期望的行为一致。

替换

替换是面向对象语言所支持的多态特性,同一个行为具有多个不同表现形式或形态的能力。

简单来说就是当我的一个方法的参数是一个接口类型时,这个方法可以接受所有实现过这个接口的实现类。

与期望行为一致的替换

在不了解派生类的情况下,仅通过接口或基类的方法,即可清楚知道方法的行为,而不管那种派生类的实现,都与接口或基类方法的期望行为一致。

在商城项目中,推出了三种促销方式:

  1. 满减活动,两百以上打把这
  2. 打折活动,全场九折
  3. 返现活动,消费超 1000,返回 200

4. Interface Segregation Principle (ISP)

客户端不应该被迫依赖它不需要的方法(Clients should not be forced to depend on methods they do not use.)

该原则还有另外一个定义: 一个类对另一个类的依赖应该建立在最小的接口上。

即要为各个类建立它们需要的专用接口,而不要试图去建立一个很庞大的接口供所有依赖它的类去调用。

遵守接口隔离原则的优势

  1. 将臃肿的接口拆分为更小的接口,可以提高系统的灵活性和可维护性。
  2. 使用多个专门的接口,还能够体现出对象的层次
  3. 能够减少项目工程中的冗余代码。

5. Dependency Inversion Principle (DIP)

在进行代码架构的设计时,高层模块不应该依赖于底层模块,二者都应该依赖于抽象。抽象不应该依赖于细节,细节应该依赖于抽象。

依赖倒置原则想要表达的是:由于在软件设计中,细节具有多变性,而抽象层则相对稳定,因此以抽象为基础搭建起来的架构要比以细节为基础搭建起来的架构要稳定的多。

传统的自顶向下的设计

根据依赖导致原则进行设计

迪米特法则

迪米特法则又叫最少知识原则(LKP:Least Knowledge Principle),指的是一个类/模块对其它类/模块有越少的了解越好。

简单来说迪米特法则想要表达的思想就是:不该有直接依赖关系的类之间,不要有依赖;有依赖关系的类之间,尽量只依赖必要的接口。强调多使用中间人,目的就是为了降低模块间的耦合度。