Java设计之道——通过UML理解23种设计模式
文章目录
UML类图
从一个示例开始,请看以下这个类图,类之间的关系是我们需要关注的:
-
泛化(generalize)与实现(realize)
泛化:SUV扩展和继承小汽车的功能;实现:小汽车实现车这个概念。 -
聚合(aggregation)与组合(composition)
聚合:班级由多个学生组成;组合:轮胎和发动机组合成为小汽车。 -
关联(association)与依赖(dependency)
关联:学生上学使用了身份证;依赖:学生上学需要使用自行车。
简单来说。
泛化和实现区别在于:继承的是实体还是抽象类/接口。
聚合和组合区别在于:上层消失是否部分也会消失。
关联和依赖的区别在于:之间的联系是天然的还是临时性的。
泛化(generalize)与实现(realize)
泛化关系用一条带空心箭头的直接表示:
实现关系用一条带空心箭头的虚线表示:
”车”为一个抽象概念,在现实中并无法直接用来定义对象;只有指明具体的子类(汽车还是自行车),才可以用来定义对象。
即实现可以理解为接口继承和抽象类的继承,泛化可以理解为实体继承。
聚合(aggregation)与组合(composition)
聚合关系用一条带空心菱形箭头的直线表示:
聚合关系用于表示实体对象之间的关系,表示整体由部分构成的语义。
组合关系用一条带实心菱形箭头直线表示:
组合关系是一种强依赖的特殊聚合关系,如果整体不存在了,则部分也不存在了;例如, 公司不存在了,部门也将不存在了;
聚合关系与组合关系不同的是,整体和部分不是强依赖的,即使整体不存在了,部分仍然存在;例如, 部门撤销了,人员不会消失,他们依然存在;
关联(association)与依赖(dependency)
关联关系是用一条直线表示的,关联关系默认不强调方向,表示对象间相互知道;如果特别强调方向,如下图,表示A知道B,但 B不知道A;
依赖关系是用一套带箭头的虚线表示的,依赖也有方向,双向依赖是一种非常糟糕的结构,我们总是应该保持单向依赖,杜绝双向依赖的产生。
关联和依赖的区别在于:
依赖描述一个对象在运行期间会用到另一个对象,它是一种临时性的关系,通常在运行期间产生,并且随着运行时的变化; 依赖关系也可能发生变化。
关联是一种静态关系, 通常与运行状态无关,一般由常识等因素决定的;它一般用来定义对象之间静态的、天然的结构。
23种设计模式
创建型模式
创建型模式(Creational Pattern)对类的实例化过程进行了抽象,能够将软件模块中对象的创建和对象的使用分离。
结构型模式
结构型模式(Structural Pattern)描述如何将类或者对 象结合在一起形成更大的结构,就像搭积木,可以通过 简单积木的组合形成复杂的、功能更为强大的结构。
- 适配器模式————— ☆☆☆☆
- 桥接模式—————— ☆☆☆
- 组合模式—————— ☆☆☆☆
- 装饰模式—————— ☆☆☆
- 外观模式—————— ☆☆☆☆☆
- 享元模式—————— ☆
- 代理模式—————— ☆☆☆☆
行为型模式
行为型模式(Behavioral Pattern)是对在不同的对象之间划分责任和算法的抽象化。
行为型模式不仅仅关注类和对象的结构,而且重点关注它们之间的相互作用。