(1)耦合
耦合通常是指各个对象之间的依赖程度,一般来说,依赖程度越高就代表耦合性高。与耦合对应的,就是解耦。解耦是一个动词,意思是解除对象之间的依赖关系,目的就是让对象之间的耦合程度变低。
(2)抽象
当我们提到抽象时,你需要特别注意,因为我们讨论的内容可能已经脱离了某种具体的语言。一般来说,我们指的是对于某一类行为的约束声明。
比如我们发现猫和狗都有叫的行为,事实上所有的动物都可以发出叫声。此时我们定义出动物
Animal
类,并且声明了一个叫bark()
的行为;猫和狗则分别实现Animal#bark()
行为。这个过程中,Animal#bark()
就是对各种动物叫唤的行为抽象,Animal
也是动物的抽象。
另外一些时候,我们会提到抽象类。抽象类则专指 JAVA 中被abstract
关键字修饰的类,并且出于规范,针对于文中出现的抽象类,我会尽量以 Abstract 作为类的前缀,比如AbstractCommand
。
(3)接口
和抽象一样,当我们说接口时,也需要根据语境分析用意。我们在文档中提到接口时,主要有两三层意义。
- 物理接口:在适配器模式中,我们描述了数据线需要接入其他的实现了某个标准的设备,比如 type-c 接口;
- 远程接口:指在系统内暴露给外部,以供客户端和系统进行数据交互的方法,例如我们常说的
Controller
等,在代理模式中描述远程代理时,我们就使用了这一层意思; - JAVA关键字:JAVA 中被
interface
关键字修饰的类。
(4)客户端
几乎在所有的模式中,我们都提到了客户端。应当注意,客户端指的是使用模式的任何地方,并不局限于某个具体的类。以单例模式来说,客户端指的是任何使用了Singleton
对象的地方。
(5)委托
我们曾不止一次提到委托,委托描述了一种行为机制。一个对象把发送给自身的请求转发给另一个对象,这样的行为就是委托。比如现有对象a
收到了来自其他对象发来的请求,出于一些原因a
并不处理这个请求,而是直接将该请求转发给对象b
,由b
负责处理该请求,我们就说对象a
将请求委托给了对象b
。
对于类图,似乎我们很难参照一个完全统一的标准,对于同样的一份代码,在不同的书籍展示出的类图中也有细微的差别。我们不用去分辨谁对谁错,为了在后续的文档中不产生误解,我们将对类图中容易产生理解偏差的部分做一个约定。毕竟类图只是一个帮助我们理解的方式,而不应该成为我们学习道路上的桎梏。
(1)接口
接口中有<>标识,并且接口中的方法应为斜体(仅有声明没有实现)。
上图表示一个组件的接口,该组件接口中定义了两个行为,分别为添加子组件
addChildren(Component):void
,绘制自己到屏幕上paint():void
。
(2)抽象类
抽象类名和抽象方法应为斜体,非抽象方法不使用斜体。并且抽象类应以Abstract
为命名前缀,以示区分。
上图表示一个抽象的树形节点类,该抽象类中维护了一个子节点列表的属性,并提供了两个方法。
addNode(AbstractTreeNode):void
方法用于将另一个树形节点对象添加到子节点列表中,提供了统一的实现,子类可根据需要决定是否重写,countNodeSize():int
方法用于统计该属性节点的数量,是抽象方法,由子类负责实现。
(3)类
无特别约定。
上图表示一个用户类,提供两个用户状态,分别为姓名
name
和年龄age
,并为其分别提供状态获取方法。export(String):void
表示打印当前用户信息。
(1)继承
描述一个类与另一个之间的继承关系,使用实线连接两个类,指向被继承一端使用空心三角箭头。
上图描述了猫
Cat
继承自动物Animal
(2)实现
描述一个类与一个接口之间的实现关系,使用虚线连接类和接口,指向接口的一端使用空心三角箭头。
上图描述了猫
Cat
实现了叫唤接口Brak
(3)实例化
描述一个类实例化另一个类的对象,使用虚线连接两个类,被实例化的类一端使用普通箭头。
上图描述了
UserService
需要实例化User
对象
(4)委托
描述一个类将发送到自身的请求转发给另一个类的实例上,使用实线连接两个类,被委托的一端使用普通箭头。
上图描述了对于图形对象
Shape
的获取面积请求将转发到圆形对象Circle
上,Shape
类维护一个指向Circle
类实例的引用,并在合适的时机将请求转发给这个引用对应的对象上。可在箭头上标注出引用对象的名称“circle”,也可以省略它。
请注意,我们将使用没有箭头的虚线来标注注释,并且为了更方便识别,将使用不同的颜色以示区分。
(5)聚合
描述一个类与另一个类的实例对象之间整体与部分的关系,换句话说,一个对象是另一个对象的组成部分。使用实线连接这两个类,被包含的一端使用普通箭头(表示相识关系),包含的一端使用空心菱形箭头(表示聚合关系)。
上图描述了文件夹
Folder
内部维护了多个文件File
对象
上图描述了汽车
Car
由引擎Engine
、控制系统ControlSystem
和油箱Tank
等部分组成
《Design Patterns - Elements of Reusable Object-Oriented Software》——(Erich Gamma、Richard Helm、Ralph Johnson、John Vlissides)