设计模式-设计原则

146 阅读5分钟

单一职责原则

官方定义:

  1. 单一职责原则(Single Responsibility Principle, SRP),有且仅有一个原因引起类的变更

自我理解:

一个类只负责一想职责

注意事项&细节

  • 降低类的复杂度,一个类只负责一项职责

  • 提高类的可读性以及可维护性

  • 降低变更引起的风险

  • 通常情况下,我们应当遵守类级别单一职责原则

接口隔离原则

官方定义:

接口隔离原则(Interface Segregation Principle),又称为ISP原则,官方定义为:

  1. Clients should not be forced to depend upon interfaces that they don’t use. (客户端不应该依赖它不需要的接口)
  2. The dependency of one class to another one should depend on the smallest possible interface. (类间的依赖关系应该建立在最小的接口上)

自我理解:

不要在一个接口里面定义过多的方法,接口应该尽量细化

注意事项&细节

接口隔离原则就是当我一个类通过接口依赖(使用)另一个类的时候,要保证依赖的该接口是最小的, 接口里面有方法用不到的,就进行隔离,而隔离的做法就是,就对原来接口进行拆分,拆分为最小粒度,来避免耦合

依赖倒转原则

官方定义:

依赖倒转原则,又称依赖倒置原则(Dependence Inversion Principle),又称DIP原则,官方定义为:

  1. High level modules should not depend upon low level modules. Both should depend upon abstractions. (上层模块不应该依赖底层模块,它们都应该依赖于抽象)

  2. Abstractions should not depend upon details. Details should depend upon abstractions. (抽象不应该依赖于细节,细节应该依赖于抽象)

自我理解:

面向接口编程

依赖倒转原则本质上 就是通过抽象(抽象类和接口)使得各个类或者模块实现彼此独立,互相不影响,实现模块间松耦合,要先顶层再细节的方式来进行代码设计

依赖关系传递方式

  • 通过接口传递

  • 通过构造方法传递

  • 通过set()方法传递

注意事项&细节

  • 低层模块尽量都要有抽象类或接口,或者两者都有,程序稳定性更好

  • 变量的声明类型尽量是抽象类或者接口,这样我们的变量引用和实际对象间,就存在一个缓冲层, 利于程序扩展和优化

  • 继承时遵循里式替换原则

里氏替换原则

官方定义:

里氏替换原则(Liskov Substitution Principle,LSP)是1988年,麻省理工学院一位姓里的女士提出的

  1. If for each object o1 of type S there is an object o2 of type T such that for all programs P defined in terms of T,the behavior of P is unchanged when o1 is substituted for o2 then S is a subtype of T. 如果对每一个类型为S的对象o1,都有类型为T的对象o2,使得以T定义的所有程序P在所有的对象 o1都代换成o2时,程序P的行为没有发生变化,那么类型S是类型T的子类型
  2. Functions that use pointers or references to base classes must be able to use objects of derived classes without knowing it. 所有引用基类的地方必须能透明地使用其子类的对象

自我理解:

里氏替换原则通俗的来讲:子类可以扩展父类的功能,但是子类不能修改父类原有的功能

里氏替换原则就是给继承性的使用制定了规范

注意事项&细节

  • 子类可以实现父类的抽象方法,但是不能覆盖父类的非抽象方法

  • 子类中可以扩展自己的方法

  • 里氏替换原则并非让我们尽量避免使用继承

  • 里氏替换原则是实现开闭原则的重要方式之一

开闭原则

官方定义:

开闭原则( Open Close Principle ),又称为OCP原则,他的官方定义如下:

  1. Software entities like classes,modules and functions should be open for extension but closed for modifications. 一个软件实体如类,模块和函数应该对扩展开放,对修改关闭

自我理解:

若需求变化了,是通过扩展来实现,而不是通过修改来实现

对扩展开放 -- 提供方

对修改关闭 -- 调用方

注意事项&细节

  • 开闭原则 - 最基础最重要的设计原则

  • 开闭原则可以提高复用性和可维护性

迪米特法则

官方定义:

迪米特法则(Law of Demeter, LoD)是1987年秋天由lan holland在美国东北大学一个叫做迪米特的项 目设计提 出的,它要求一个对象应该对其他对象有最少的了解,所以迪米特法则又叫做最少知识原则(Least Knowledge Principle, LKP)

  1. One object should have a minimum understanding of other objects (一个对象应该对其他对象有最少的了解 )

  2. Only talk to your immediate friends ( 只与直接的朋友通信)

自我理解:

你女朋友不能饶过你跟你兄弟联系

注意事项&细节

  • 迪米特法则的核心是降低类之间的耦合
  • 从被依赖者的角度来说,尽量将逻辑封装在类的内部,对外除了提供的public方法,不泄露任何信息
  • 从依赖者的角度来说,只依赖应该依赖的对象
  • 切忌不要为了用而用

合成复用原则

官方定义:

合成复用原则(Composite Reuse Principle)的官方定义如下:

  1. Try to use composition / aggregation instead of inheritance( 尽量使用组合/聚合的方式,而不是使用继承 )

自我理解:

对象使用组合/聚合方式,依赖方式

注意事项&细节

  • 尽量不使用集成方式

总结

  • 开闭原则:要求对扩展开放,对修改关闭

  • 里氏替换原则:不要破坏继承体系

  • 依赖倒置原则:要求面向接口编程

  • 单一职责原则:实现类职责要单一

  • 接口隔离原则:在设计接口的时候要精简单一

  • 迪米特法则:只与直接的朋友的通信

  • 合成复用原则:尽量使用聚合和组合的方式,而不是使用继承