一、接口:类的“能力契约”📜
关键字:接口、操作集合、契约、无实现
🤔
接口是“规定类要做什么,但不规定怎么做”的契约——它只包含“操作(方法)”,没有属性和实现代码。比如“可拖拽接口(Draggable)”,规定类必须有“drag()”操作,但不管这个操作是怎么写的~
💡 新手类比:
接口像“手机充电协议”——只要手机支持这个协议(实现接口),不管是华为还是苹果,都能用电宝充电(调用接口操作),但充电的内部逻辑(实现)各自不同。
📊 UML 中的接口表示:
- 方式 1:小圆圈 + 接口名(简洁版,比如“Observer”);
- 方式 2:«interface»构造型的类(详细版,显示接口里的操作,比如“«interface» Observer {update() }”)。
二、类图中的关系:类的“社交规则”🧩
关键字:关联、泛化、依赖、实现、聚合、组合
1. 关联关系:类的“普通朋友”🔗
描述类之间的“连接关系”,比如“学生”和“学校”的关系(学生在学校上学)。
核心属性:
– 多重性:表示“多少个 A 对应多少个 B”,比如“1 个学校对应多个学生”(Student 端写“1..*”,School 端写“0..*”);
– 导航性:用箭头表示“谁能找到谁”,比如“订单→产品”(订单能找到对应的产品,但产品不知道自己属于哪些订单);
– 角色名:表示类在关联中的“身份”,比如“Person”在关联中是“Worker”,“Room”是“Office”。
🌰 特殊关联:
- 自关联:类和自己关联,比如“学生是另一些学生的班长”;
- N 元关联:三个及以上类的关联(不推荐,建议拆成多个二元关联)。
2. 聚合 & 组合:类的“整体 - 部分”关系 🧱
都是“整体包含部分”的关系,但 紧密程度不同:
聚合(Aggregation):“松散的包含”——部分可以脱离整体存在,比如“教室(整体)包含课桌(部分)”,课桌可以搬到其他教室;
组合(Composition):“紧密的包含”——部分和整体同生共死,比如“窗口(整体)包含框架(部分)”,窗口删除了,框架也必须删除。
📊 UML 表示:
用“空心菱形(聚合)”或“实心菱形(组合)”放在“整体”类的一端,比如“Window ◆- Frame”(组合)。
3. 泛化关系:类的“父子继承”👨👦
就是 面向对象的“继承”——子类(子元素)继承父类(父元素)的属性和操作,还能添加自己的内容。比如“老虎(Tiger)”和“鸟(Bird)”都继承“动物(Animal)”类。
📊 UML 表示:
用“空心箭头 + 实线”从子类指向父类,比如“Tiger → Animal”。
4. 依赖关系:类的“临时借用”📤
表示一个类“临时使用”另一个类的内容(比如方法参数、局部变量),关系很弱。比如“客户类(Client)”的方法需要“提供者类(Supplier)”的对象作为参数。
📊 UML 表示:
用“虚线 + 箭头”从“依赖方”指向“被依赖方”,比如“Client – – > Supplier”。
5. 实现关系:类与接口的“履约”✅
表示类“实现了接口的所有操作”,比如“墙壁类(Wall)”实现了“可测量接口(Measurable)”,必须写“getLength()”“getArea()”等操作。
📊 UML 表示:
用“虚线 + 空心箭头”从类指向接口,比如“Wall – – > Measurable”。
三、类的高级概念:抽象类 & 模板类 🎯
关键字:抽象类、模板类
1. 抽象类(Abstract Class):
不能直接创建对象的类,里面可以有“抽象操作”(只有定义,没有实现),必须由子类实现。比如“图形类(Shape)”是抽象类,“draw()”是抽象操作,“圆形(Circle)”子类实现具体的 draw 逻辑。
2. 模板类(Template Class):
就是“泛型类”——类的属性 / 操作可以支持“任意类型”,比如 Java 里的“ArrayList<T>”,T 可以是 String、Integer 等类型。
总结:类间关系是“系统的骨架”🛠️
🎉
类是“零件”,类间关系是“把零件组装成系统的胶水”——搞懂这些关系,就能把零散的类变成一个有逻辑的系统啦~
要不要我帮你整理一份 类间关系的 UML 表示对照表,方便你快速区分各种关系?