软件设计模式的7条原则


软件设计的7条原则

1、开闭原则

软件实体应该对扩展开放,对修改关闭
对扩展开放可以使得软件拥有一定的灵活性,同时对修改关闭可以保证软件的稳定性。
(勃兰特·梅耶于1988年在《面向对象软件设计》中提出)

2、里氏替换原则

继承必须保证超类所拥有的性质在子类中依然成立
遵守里氏替换原则在对父类继承时,要保证子类不对父类的属性或方法进行重写,而只是扩展父类的功能。
这是对开闭原则更严苛的补充。除了开闭原则的优势,同时保证了继承中重写父类方法造成的可复用性变差与稳定性变差的问题。
实际编程中:子类不可以重写父类的方法,只能为父类添加方法。如果在设计类时发现不得不重写父类的方法,则表明类的组织结构有问题,需要重新设计类的继承体系。
(里斯科夫于1987年在“面向对象技术高峰会议”上提出)

3、单一职责原则

其核心是一个类只能承担一项职责
在实际设计中,可以以是否只有一个引起类变化的原因作为准则,如果不止一个原因会引起类的变化,则需要对类进行重新拆分。
如果一个类或对象承担了太多指责,则其中一个指责的变化可以带来对其他责任的影响,且不利于对代码的复用性,容易造成代码的冗余和浪费。
准守单一责任原则的好处:

1、降低类的复杂度,一个类只负责单一的职责,逻辑清晰,提高内聚,降低耦合。

2、提高代码的可读性,提高代码的可复用性。

3、增强代码的可读性与可维护性。

4、类的变更是必然的,功能的增加必然会产生类的变更,单一职责原则可以是变更带来的影响最小。

(罗波特·C·马丁于1987年在《敏捷软件开发:原则、模式、实践》上提出)

4、接口隔离原则

接口隔离原则是将庞大臃肿的接口定义拆分成更小更具体的接口。借口只暴露类需要实现的方法。和单一职责类似,接口隔离原则主要要求接口在定义时职责要单一,“隔离”主要是指对接口依赖的隔离。
优势:

1、将庞大的接口拆分成更细粒度的接口,灵活性和扩展性好,也更利于在类实现的时候遵守单一责任原则

2、接口隔离提高了系统的内聚,降低了系统的耦合。

3、有利于代码的复用。

5、依赖倒置原则,减少冗余代码。

在大型项目开发过程当中,会拆用分层的解决方案,即上层调用下层,上层依赖下层。这种依赖使得下层设计产生变动时,上层也要跟着做调整,这样会导致模块的复用性降低,提高开发和维护成本。
依赖导致的原则就应运而生:

依赖倒置原则的定义,高层模块不应该以来低层模块,两者都应该以来其抽象,抽象不依赖细节,细节应该依赖抽象。

优势:

1、由于都对接口进行了依赖,因此减少了类之间的耦合。

2、封闭了对类实现的修改,增强了程序的稳定性。

3、对开发过程来说,依赖倒置原则的核心是面向接口开发,减少了 并行开发的依赖与风险。

6、迪米特原则

又叫最少知道原则。核心是一个类或对象应尽可能少地与其他实体发生相互作用。
其初衷是降低类的耦合,但是需要注意,由于要符合迪米特原则,需要创建许多额外的中介类,过多的中介类会增加系统的复杂度,有时反而是得不偿失。
注意:
通常我们并不会单独使用迪米特原则,因为引入新的累来解藕的效果并不明显,但是如果模块与模块之间的交互通过一个中介类来统一处理,可以大大减少模块间的耦合程度。

7、合成复用原则

合成复用原则的核心是 在设计类的复用时,要尽量先使用组合或聚合的方式设计,尽量少使用继承。
合成复用原则尽量提倡不使用继承,如果使用继承,则要遵守里氏替换原则。
合成复用通过组合和聚合的方式实现复用,实现上通常使用属性、参数的方式引入其他实体进行通信。
我们不使用继承,而使用组合或聚合的好处是什么呢?
合成复用相对于继承的优势:

1、维持了类的封装性

2、类之间的耦合性降低

3、服用的灵活性提高,通过协议可以动态地修改引入实体的行为

例如:我们有一个教师类父类,我们可以通过继承来定义多个不同科目的教师,各个子类和父类他们都有一个teach()类。子类的实现会覆盖父类。这样就破坏了封装性。

设计模式的分类

范围\目的 创建型模式 结构型模式 行为型模式
类模式 工厂方法 (类)适配器 模板方法、解释器
对象模式 单例
原型
抽象工厂
建造者
代理
(对象)适配器
桥接
装饰
外观
享元
组合
策略
命令
职责链
状态
观察者
中介者
迭代器
访问者
备忘录

1、根据作用对象或范围分类:

类模式用来布局类与子类的关系。
对象模式除了类模式之外的都是对象模式。

2、根据目的分类:

创建型设计模式用来描述如何创建对象。其核心是将对象的创建和使用分离。包括单例模式、原型模式、抽象工厂模式、建造者模式。
结构型模式用来描述如何组织类和对象。包括代理模式、(对象)适配器模式、桥接模式、装饰模式、外观模式、享元模式、组合模式。
行为型模式用来描述类或对象的行为。包括 策略模式、命令模式、职责链模式、状态模式、观察者模式、中介者模式、迭代器模式、访问者模式、备忘录模式。