接触软件体系架构设计(七)

从2017年前,大部分都是采用设计模式中的7大原则进行实践

设计模式有如下原则:

1、单一职责原则(Single Responsibility Principle),就一个类、对象以及方法而言,应该仅有一个引起它变化的原因。

其核心就是控制类的粒度大小、将对象解耦、提高其内聚性。这个原则,设计上最简单,不同的设计者在运用的时候根据不同的条件和粒度,可以多种方式拆分。

2、里氏替换原则(Liskov Substitution Principle,LSP),通俗来讲就是:子类可以扩展父类的功能,但不能改变父类原有的功能。也就是说:子类继承父类时,除添加新的方法完成新增功能外,尽量不要重写父类的方法。

这个是继承复用的基础,它反映了基类与子类之间的关系,是对开闭原则的补充,是对实现抽象化的具体步骤的规范。

最重要的一点,根据里氏替换原则保证超类或父类良好的设计,才能提高复用性。

这里有一个很好的范例:鸟,鸟的常规动作就是飞,但有些鸟是不能飞(鸵鸟、企鹅)

3、依赖倒置原则(Dependence Inversion Principle,DIP),高层模块不应该依赖低层模块,两者都应该依赖其抽象;抽象不应该依赖细节,细节应该依赖抽象(High level modules shouldnot depend upon low level modules.Both should depend upon abstractions.Abstractions should not depend upon details. Details should depend upon abstractions)。

其核心思想是:要面向接口编程,不要面向实现编程。

4、接口隔离原则(Interface Segregation Principle,ISP),目的建立单一接口,要求:

客户端不应该依赖它不需要的接口;类之间依赖关系应该建立在最小的接口上。

好处:降低设计、开发、维护的难度。

接口隔离原则和单一职责都是为了提高类的内聚性、降低它们之间的耦合性,体现了封装的思想,但两者是不同的:
单一职责原则注重的是职责,而接口隔离原则注重的是对接口依赖的隔离。
单一职责原则主要是约束类,它针对的是程序中的实现和细节;接口隔离原则主要约束接口,主要针对抽象和程序整体框架的构建。

5、迪米特法则(Law of Demeter,LoD)又叫作最少知识原则(Least Knowledge Principle,LKP),说简单点:设计出来的类,是专属类,谁调用他都有明确的规定。

从迪米特法则的定义和特点可知,它强调以下两点:
从依赖者的角度来说,只依赖应该依赖的对象。
从被依赖者的角度说,只暴露应该暴露的方法。

运用迪米特法则时要注意以下 6 点。
在类的划分上,应该创建弱耦合的类。类与类之间的耦合越弱,就越有利于实现可复用的目标。
在类的结构设计上,尽量降低类成员的访问权限。
在类的设计上,优先考虑将一个类设置成不变类。
在对其他类的引用上,将引用其他对象的次数降到最低。
不暴露类的属性成员,而应该提供相应的访问器(set 和 get 方法)。
谨慎使用序列化(Serializable)功能。

 

这里需要提及一点:在多层设计中,有强弱关系。采用强关系,只能访问自己允许访问的那一层。和迪米特法则是一致的

6、开闭原则(Open Closed Principle,OCP):软件实体应当对扩展开放,对修改关闭。在设计和运用中,用抽象构建架构,用实现扩展原则;这个在设计一个软件应该优先考虑的原则

7、合成复用原则(Composite Reuse Principle,CRP)又叫组合/聚合复用原则(Composition/Aggregate Reuse Principle,CARP)。它要求在软件复用时,要尽量先使用组合或者聚合等关联关系来实现,其次才考虑使用继承关系来实现。

 

设计原则是软件设计模式必须尽量遵循的原则,各种原则要求的侧重点不同。

其中,开闭原则是总纲,它告诉我们要对扩展开放,对修改关闭;里氏替换原则告诉我们不要破坏继承体系;依赖倒置原则告诉我们要面向接口编程;单一职责原则告诉我们实现类要职责单一;接口隔离原则告诉我们在设计接口的时候要精简单一;迪米特法则告诉我们要降低耦合度;合成复用原则告诉我们要优先使用组合或者聚合关系复用,少用继承关系复用。

posted @ 2020-05-14 17:55  西就东城  阅读(131)  评论(0编辑  收藏  举报