对设计模式的一些整理。
#@author: gr
#@date: 2015-11-13
#@email: forgerui@gmail.com
-
依赖:一种模型元素之间的关系的描述。例如类A调用了类B,那么我们说类A依赖于类B。
-
耦合:一种模型元素之间的关系的描述。例如类A调用了类B或类B调用了类A,那么我们说类A与类B有耦合关系。
-
耦合度:模型元素之间的依赖程度的量化描述。
-
控制:一种模型元素之间的关系的描述。例如类A调用了类B,那么我们说类A控制类B。
一、六大原则
1.1 单一职责原则 ****
类的职责要单一,一个类只做一个工作。
1.2 里氏替换原则 ****
在接受基类对象的地方必然可以透明地接受一个子类对象。
1.3 依赖倒置原则 *****
高层模块不应该依赖低层模块,二者都应该依赖其抽象;抽象不应该依赖细节;细节应该依赖抽象。
问题由来:类A直接依赖类B,假如要将类A改为依赖类C,则必须通过修改类A的代码来达成。这种场景下,类A一般是高层模块,负责复杂的业务逻辑;类B和类C是低层模块,负责基本的原子操作;假如修改类A,会给程序带来不必要的风险。
解决方案:将类A修改为依赖接口I,类B和类C各自实现接口I,类A通过接口I间接与类B或者类C发生联系,则会大大降低修改类A的几率。
A --> B
A --> C
A --> I B => I C => I
在实际编程中,我们一般需要做到如下3点:
- 低层模块尽量都要有抽象类或接口,或者两者都有。
- 变量的声明类型尽量是抽象类或接口。
- 使用继承时遵循里氏替换原则。
依赖倒置原则的核心就是要我们面向接口编程,理解了面向接口编程,也就理解了依赖倒置。
1.4 接口隔离原则 **
客户端不应该依赖它不需要的接口;一个类对另一个类的依赖应该建立在最小的接口上。
1.5 demeter法则 ***
lonely demeter,是宙斯的妻子,因为女儿被波塞冬掳走,变得性格孤僻。
一个对象应该对其他的对象保持最少的了解,最少知识原则。
1.6 开闭原则 *****
对修改关闭,对扩展打开,即在原有基础上去扩展其功能。
1.7 合成复用原则 ****
尽量多使用组合和聚合关系,少用继承关系。
UML类图几种关系
1. 泛化(Generalization)
是一种继承关系,它指定了子类如何特化父类的所有特征和行为例如:老虎是动物的一种.
2. 实现(Realization)
【实现关系】:是一种类与接口的关系,表示类是接口所有特征和行为的实现
3. 关联
【关联关系】:是一种拥有的关系,它使一个类知道另一个类的属性和方法;如:老师与学生,丈夫与妻子。
关联可以是双向的,也可以是单向的。双向的关联可以有两个箭头或者没有箭头,单向的关联有一个箭头。
4. 依赖(Dependency)
【依赖关系】:是一种使用的关系,所以要尽量不使用双向的互相依赖。
【代码表现】:局部变量、方法的参数或者对静态方法的调用
5. 聚合(Aggregation)
【聚合关系】:是整体与部分的关系.如车和轮胎是整体和部分的关系.
聚合关系是关联关系的一种,是强的关联关系;关联和聚合在语法上无法区分,必须考察具体的逻辑关系。
【代码体现】:成员变量
6. 组合(Composition)
【组合关系】:是整体与部分的关系.,没有公司就不存在部门 组合关系是关联关系的一种,是比聚合关系还要强的关系,它要求普通的聚合关系中代表整体的对象负责代表部分的对象的生命周期
【代码体现】:成员变量
7. 总结
各种关系的强弱顺序:
泛化= 实现> 组合> 聚合> 关联> 依赖
下面这张UML图,比较形象地展示了各种类图关系: