设计模式所遵循的基本原则

1、单一职责原则(Single Responsibility Principle,SRP)

(1)定义
单一职责是编写程序的一个准则,是一个不可逾越的红线。单一职责原则要求设计一个类的时候要么只体现一个功能,要么有多个功能时彼此独立,要么多个功能彼此之间的依赖是单向的。
(2)好处
单一职责原则确保每一个功能都是最小独立单元,可以根据业务进行灵活的组装。而这种组装的方式将极大地降低项目中的耦合度,在未来业务发生变更时,会极大地降低维护成本,带来巨大的好处。
(3)违反单一职责原则原因
简单来说,就是职责的扩散,也就是需求发生变化导致的。国内项目的开发采用迭代升级的方式,随着时间增长用户提供的需求会逐渐增加,导致类的功能会逐渐细化,而这种细化分为两个方向:横向细化,纵向细化。
横向细化:指的是在原有业务流程不变的情况下,产生一个全新的业务流程线。
纵向细化:指的是在不增加新业务流程线的情况下,对原有业务流程中相关环节进行修改。
(4)总结
单一职责原则并不是一个孤立的面向对象设计原则,它是面向对象设计五个基本原则(SOLID)之一,目的是降低项目耦合度,增加项目扩展性。
在实际开发中,遇到违反单一职责原则需要进行重构的时候,可以使用代理模式(Proxy)与外观模式(Facade)来进行解决。
注意点:
单一职责原则最难的就是进行职责划分。这个需要根据具体需求进行分析。
单一职责原则提出标准:用职责和变化原因来衡量接口或类设计的是否优良,但是职责和变化原因都是不可度量的,因项目和环境而异。
接口一定要做到单一职责,类的设计尽量做到只有一个原因引起变化。

2、开闭原则(Open Closed Principle)

(1)定义
在需求发生变更时,尽量通过扩展软件实体的行为来实现变化,而不是通过修改已有的代码来实现变化。简单说,就是关闭代码修改的通道,打开代码扩展的通道。
(2)开闭原则使用场景

  1. 将需求中未来可能出现变化的方法做成抽象方法,放到一个抽象类或接口中,当需求发生变更时,只需要生成一个新的实现类即可,可以减少开发的成本,降低项目的耦合度。
  2. 参数类型控制。利用多态,将方法中的参数设置为父类型,当需求发生变更时,传入不同的子类对象。
  3. 元数据(metadata)控件模块的行为控制。元数据就是配置信息,如数据库的相关连接信息,将需要变化的部分放入配置文件。
  4. 制定项目章程。在Spring框架的使用过程中,Spring项目中使用注解或配置文件的方式进行开发,不能混用。

3、接口隔离原则(Interface Segregation Principle)

(1)定义
接口隔离原则指的是接口中的方法必须都是实现类所需要的方法。
(2)优点
1)降低接口实现类开发难度
2)降低项目耦合度,减轻业务变更时的维护难度
(3)接口隔离原则的实现方案一:接口拆分方案
接口拆分方案是一种为了满足接口隔离设计原则而产生的重构方案,要求将原有接口中的方法分割为若干个独立的单元,每一个单元就是一个接口。
接口拆分方案的优点:
1)降低了接口实现类的开发难度。
2)增加了接口使用的灵活性。
接口拆分方案的缺点:
接口拆分方案只适用于原有接口中方法较少的情况,如果原有接口中的方法过多,将会导致“接口爆炸”,变相地增加了接口实现类的开发的负担。
(4)接口隔离原则的实现方案二:适配器模式

4、里氏替换原则(Liskov Substitution Principle)

(1)背景
里氏替换原则告诉我们该如何使用继承。
继承的优点:
1)增加了代码的复用性。
2)增加了功能扩充的灵活性。
继承使用不当产生的问题:
1)增加耦合度,导致父类变化时子类需要修改。
2)增加侵入性,导致父类的方法和属性侵入到子类的方法。
(2)定义
子类可以扩展父类的功能,但不能改变父类原有的功能。
使用原则:
1)子类必须实现父类的抽象方法,但不得重写(覆盖)父类的非抽象(已实现)方法。
2)子类中可以增加自己特有的方法。
3)当子类覆盖或实现父类的方法时,方法的前置条件(即方法的形参)要比父类方法的输入参数更宽松。
4)当子类的方法实现父类的抽象方法时,方法的后置条件(即方法的返回值)要比父类更严格。

5、依赖倒置原则(Dependence Inversion Principle)

(1)定义
依赖:类A在实现某种功能时,必须依靠类B的帮助,比如Service类与Dao类之间的关系。
依赖传递:1)通过构造方法实现依赖;2)通过set方法实现依赖;3)通过方法中的参数实现依赖。
倒置:取消依赖的约束关系。
依赖倒置:即为面向接口编程,两个类之间的依赖应该通过接口进行隔离,这样可以有效地降低耦合度,降低未来业务变更时的维护成本。
(2)目的与优势
1)依赖倒置原则的目的:依赖类与被依赖类之间通过接口相联系,以降低依赖类和被依赖类之间的耦合度。
2)依赖倒置原则的好处:
a)有利于模块间的并行开发
b)降低模块间的耦合度
(3)依赖倒置原则的使用方式
1)低层模块尽量抽取成抽象类或接口,或者既有抽象类又有接口。
2)变量的声明类型尽量是抽象类或接口。
3)使用继承时遵循里氏替换原则。
(4)Spring框架中的IOC(控制翻转)
IOC = 依赖倒置原则 + 反射机制 + 工厂设计模式

6、避免重复性开发原则(Don’t Repeat Yourself)

(1)定义
该原则是面向对象思想中的一个基本设计原则,建议开发人员不要重复性地进行代码开发,要多多使用封装,增加代码的复用性以及降低耦合度。
(2)重复性代码开发的隐患
1)增加重复性开发的工作量。
2)同一个业务在项目中会存在多个解决方案,导致业务崩塌。
3)增加维护困难。

7、将复杂问题拆分成简单问题原则(Keep It Stupid Simple)

(1)定义
将一个复杂的问题尽可能拆分成若干个简单的小单元进行实现,这样可以降低问题实现的难度,降低耦合度,同时也会增加代码的复用性。
(2)优点
以很简洁的代码来解决很复杂的问题。
代码会更加灵活,易于扩展、修改或重构,并且能够适应需求的变化。

8、迪米特原则(Law of Demeter)

(1)定义
迪米特原则又叫最少知道原则,就是说一个类对于其他类尽可能少的依赖。如果必须依赖,是通过一个中间类来建立关联。
(2)作用
迪米特原则用来降低类之间的耦合度,便于项目的扩展和维护。
(3)什么是朋友关系
两个对象之间存在耦合,他们就是朋友关系。
1)类B作为类A的成员变量,类B与类A之间形成了朋友关系。
2)类B作为类A方法的参数,类B与类A之间形成了朋友关系。
3)类B作为类A方法的返回值,类B与类A之间形成了朋友关系。
(4)朋友之间如何保持距离
如果类A与类B之间形成朋友关系,类B应该尽可能对类A隐藏方法实现细节,即尽可能减少public方法的数量。

你可能感兴趣的:(Design,Patterns)