设计模式常用的七大原则

设计模式的七大原则是平时编码时应该遵守的原则,是各种设计模式的基础。

单一职责原则

一个类应该只负责一项职责。如果类A负责两个不同的职责,当职责1需要变更而改变类A时可能导致职责2错误,所以需要将类A粒度分解为类A1和类A2。

  • 降低类的复杂度,一个类只负责一项职责
  • 提高类的可读性,可维护性
  • 降低需求变更导致之前功能不可用的风险
  • 除非逻辑足够简单,才可以在代码级违反单一职责原则
  • 某些情况下也可以在方法级别保持单一职责原则,前提是类中的方法数量少

接口隔离原则

类A通过接口Interface1依赖类B,类C通过接口Interface1依赖类D,如果接口Interface1对于类A和类C来说不是最小接口,则类B和类D必须实现他们不需要的方法。如果采用接口隔离原则将接口1拆分为几个独立的接口,类A和类C分别与各自需要的接口建立依赖关系,类A与类C就不会依赖不需要的接口,类B和类D也不会有多余的实现。

  • 客户端不应该依赖它不需要的接口
  • 一个类对另一个类的依赖应该建立在最小的接口上

依赖倒置原则

该原则核心是面向接口编程,相对于细节,以抽象为基础搭建的架构比较稳定。在Java中抽象一般指抽象类或接口,细节则是具体的实现类。使用接口或抽象类来定义规范,任何涉及细节的操作由具体实现类完成。

  • 高层依赖不应该依赖低层模块,二者都应该依赖其抽象
  • 抽象不应该依赖细节,细节应该依赖抽象
  • 低层模块拥有抽象类或接口会使程序稳定性更好
  • 变量声明类型应尽量使用抽象,利于程序优化与扩展
  • 继承时需要遵循里氏替换原则

里氏替换原则

里氏替换原则指出引用基类的地方可以透明的使用子类对象。在实际编程中,如果使用重写父类的方法来完成新的功能将会导致整个继承体系的复用性变差。在运行多态的程序下,导致会导致代码间的强耦合。而我们可以使用原来的父类和子类都继承一个更基础的基类,或者采用组合、继承、依赖来代替原有的继承关系。

  • 继承时,尽量不要重写父类方法,已达到透明使用子类对象
  • 在适当情况可以使用聚合、组合、依赖来解决继承导致的耦合性增强

开闭原则(OCP)

开闭原则是编程中最基础、最重要的原则。类、函数、模块应该对扩展开放(为了符合提供方需要)对修改关闭(为了符合使用方需要)。使用抽象来构建框架,用实现来扩展细节。在编程中遵循其他原则,以及使用设计模块的最终目的都是为了实现开闭原则。

  • 软件变更时,尽量使用扩展软件行为来实现变化,尽量避免修改已有代码实现变化。

迪米特法则

在迪米特法则(最少知道原则)中,一个对象应该对其他对象保持最少的了解。对于被依赖的类无论这个类多么复杂都应该将逻辑封装在类的内部,对外提供public方法,减少依赖的类的内部信息暴露。

对于一个类来说,除了成员变量、方法参数、方法返回值这些直接与类关联的对象外,陌生的类就好不要以局部变量的形式出现在这个类的内部。

  • 一个类对自己依赖的类知道的越少越好
  • 迪米特法则可以降低类之间的耦合

合成复用原则

合成复用原则强调尽量使用组合、依赖、聚合的方式来代替继承。应该使用has-a关系来代替is-a关系。

总结

  • 找出应用中可能变化的地方并独立出来
  • 针对接口编程,而不是针对实现编程
  • 为了实现交互对象之间的松耦合设计
最后修改日期: 2019年9月12日

作者

留言

撰写回覆或留言

发布留言必须填写的电子邮件地址不会公开。