学好设计模式的必备知识

磨刀不误砍柴工,在学习设计模式之前,我们需要掌握一些必备的基础知识,也可以说是学习设计模式的指导思想、原则。在学习设计模式、使用设计模式过程中,需要时刻围绕这些基础知识,因为它们是设计模式最本质、最核心的东西。

面向对象的目标

面向对象或者软件开发的目标是高内聚、低耦合,可扩展、可维护、可复用。平时软件开发工作,在保证功能和性能的基础上,其它一切努力基本都是在为了实现这些目标而进行的。

面向对象的特性

面向对象有四个特性:抽象、封装、继承、多态。这是面向对象最本质的知识,是这四个特性,支撑起了面向对象编程这杆大旗。

面向对象的设计原则

面向对象的设计原则是从实际的设计方案中总结出来的原则,对面向对象设计、面向对象编程具有指导性和约束性。让设计和开发在有限边界下开展。常见的设计原则有7个,如下:

单一职责原则:单一职责原则是实现高内聚、低耦合的指导方针。主要体现对类(接口)层面的约束。

接口隔离原则:应当为客户端提供尽可能小的单独的接口,而不是提供大的总的接口。主要体现在对接口方法层面的约束。

开闭原则:应当对扩展开放,对修改关闭。即在不修改原有代码的情况下进行扩展。开闭原则是保障可修改、可以扩展、可复用的指导方针。符合开闭原则的实现,那一定是符合下面依赖倒转原则的实现。

依赖倒转原则:针对接口编程,而不是针对实现编程。依赖倒转原则又离不开下面的里氏替换原则。

里氏替换原则:所有引用基类(父类)的地方必须能透明地使用其子类的对象。里氏替换原则是继承和多态在原则上的体现。

组合复用原则:为了达到复用,尽量使用组合/聚合关系(关联关系),少用继承。

迪米特法则:又叫最少知识原则,一个软件实体应当尽可能少的与其他实体发生相互作用。迪米特法则是对组合复用原则的聚拢操作,可以认为是特殊的组合复用原则。

完整的设计原则及其关系总结如下图:
在这里插入图片描述

在实际的工作过程中,要把面向对象的特性、设计原则、设计模式串联起来,融会贯通,才能达到面向对象的目标。比如,我们设计功能时,需要先进行抽象和封装,此时牢记单一职责原则和接口隔离原则,先定义接口和抽象类;然后在继承和多态的特性支撑下,扩展子类,此时需要以开闭原则、依赖倒转原则、里氏替换原则为指导;最后通过组合复用原则和迪米特法则组织对象之间的关联关系。将这个指导过程与设计模式的约束框架相融合,最终即可达到高内聚、低耦合,可扩展、可维护、可复用的目标。

UML类图和UML时序图

UML类图
类、接口表示格式:
类:与类名一致;
抽象类:与类名一致,但字符为斜体;
接口:与接口名一致,但接口名上用<<interface>>标示;
作用域表示格式:

+ 表示 public 作用域
- 表示 private 作用域
# 表示 protected 作用域
~ 表示 default 作用域

属性表示格式:
作用域 属性名:属性类型 = 默认值
方法表示格式:
作用域 方法名():返回值类型
上下级关系:
实现接口:实现关系,使用带空心箭头的虚线表示;
继承类:泛化关系,使用带空心箭头的实线表示;
平级关系,按照强弱程度从弱到强依次为:依赖<关联<聚合<组合
依赖关系,弱的、临时的关系,以方法参数形式存在,使用带箭头的虚线表示;
关联关系,强依赖关系,以成员变量的形式存在,使用一根实线表示;
聚合关系,特殊的关联关系,整体与部分拥有各自的生命周期,has-a关系,使用带空心箭头的实线表示;
组合关系,特殊的关联关系,整体与部分不可分离,拥有共同的生命周期,contain-a关系,使用带实心箭头的实线表示;
整合的关系图如下(图片来源《大话设计模式》):

在这里插入图片描述

ump时序图:

时序图中包括的建模元素主要有:对象、生命线、控制焦点、消息等。

对象

对象包括三种命名方式:

第一种方式包括对象名和类名,例如:objectName:ClassName
第二中方式只显示类名不显示对象名,即表示他是一个匿名对象,例如::ClassName
第三种方式只显示对象名不显示类名,如:objectName;
生命线
生命线是每个实例下面那条向下延伸的虚线,表示实例存在的生命周期;
控制焦点
生命线上那些细长的长方块表示的就是控制焦点,它表示的实例处于的某个活动、某个方法;
消息

消息一般分为同步消息,异步消息、返回消息和自关联消息;

同步消息:用实线黑体箭头表示;
异步消息:用实线箭头表示;
返回消息:用虚线箭头表示;
自关联消息:用回调式实线黑体箭头表示;
uml时序图示例

实例化场景:用户管理系统,管理员新增用户填写用户信息之后,点击保存,数据入库成功之后,异步记录日志。时序图示例,如下:
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/javaloveiphone/article/details/84782620