uml结构图讲解(概述耦合UML)
uml结构图讲解(概述耦合UML)使模块之间的耦合减至最少Minimize Coupling Between Modulespublic class Test { public static void main(String[] args) { AcademicDirector a = new AcademicDirector(); a.setPrincipal(new Principal("【张校长】")); a.setTeacher(new Teacher("【王老师】")); a.setStudent(new Student("【阿文】")); a.meetTeacher(); a.meetStudents(); } } 复制代码补充:迪米特法则在《程序员
校长类 Principal
public class Principal {
private String name;
Principal(String name) {
this.name = name;
}
public String getName() {
return name;
}
}
复制代码
老师类 Teacher
public class Teacher {
private String name;
Teacher(String name) {
this.name = name;
}
public String getName() {
return name;
}
}
复制代码
学生类 Student
public class Student {
private String name;
Student(String name) {
this.name = name;
}
public String getName() {
return name;
}
}
复制代码
测试类 Test
public class Test {
public static void main(String[] args) {
AcademicDirector a = new AcademicDirector();
a.setPrincipal(new Principal("【张校长】"));
a.setTeacher(new Teacher("【王老师】"));
a.setStudent(new Student("【阿文】"));
a.meetTeacher();
a.meetStudents();
}
}
复制代码
补充:迪米特法则在《程序员修炼之道》一书中也有提及到 —— 26 解耦与得墨忒耳法则
函数的得墨忒耳法则试图使任何给定程序中的模块之间的耦合减至最少,它设法阻止你为了获得对第三个对象的方法的访问而进入某个对象。
通过使用函数的得墨忒耳法则来解耦 编写“羞怯”的代码,我们可以实现我们的目标:
Minimize Coupling Between Modules
使模块之间的耦合减至最少
(七) 合成复用原则定义:在软件复用时,要尽量先使用组合或者聚合等关联关系来实现,其次才考虑使用继承关系来实现
这一点和里氏替换原则的目的是一致的,都是处理关于继承的内容,本质都是实现了开闭原则的具体规范
为什么用组合/聚合,不用继承
- 继承破坏了类的封装性,因为父类对于子类是透明的,而组合/聚合则不会
- 继承父子类之间之间的耦合度比组合/聚合新旧类高
- 从父类继承来的实现是静态的,运行时不会发生变化,而组合/聚合的复用灵活性高,复用可在运行时动态进行
如果代码违背了里氏替换原则,弥补的方式,一个就是我们前面说的,加入一个更普通的抽象超类,一个就是取消继承,修改为组合/聚合关系
我们简单回忆一下
- 继承我们一般都叫做 Is-a 的关系,即一个类是另一个类的一种,比如,狗是一种动物
- 组合/聚合都叫做 Has-a,即一个角色拥有一项责任或者说特性
例如我们来讨论一下常见的特殊自行车(即变速自行车),首先按照类型可以分为 山地自行车和公路自行车,按照速度搭配又可以分为 21速自行车 ,24速自行车,27速自行车(简单分)