最近现看Java设计模式,但是越看越不明白,一直搞不明白类与类之前的关系有哪些,通过几天的学习与整理通过代码实现的UML画图的方式理解类之间的相互关系。

一、类与类6大关系:

泛化(generalization)、实现(realization)、关联(association)、聚合(aggregation)、组合(compostion)、依赖(dependency)

二、类图的表示方法

public class Persion {
private String name;/*私有属性-*/
protected int age;/*保护的属性#*/
public static String school;/*公有静态属性+*/ public Persion(String name, int age, String schoole) {
this.name = name;
this.age = age;
} public void setName(String name) {
this.name = name;
}
public String getName() {
return name;
} public void setAage(int age) {
this.age = age;
}
public int getAge() {
return age;
} /**
* 静态方法
* @param school
*/
public static void setSchool(String school) {
Persion.school = school;
}
public static String getSchool() {
return school;
}
}

通过类图表示类:-表示私有属性,+表示公有,#表示protected,下划线表示static静态

三、类与类之间的关系(以下通过代码和类图来说明)

1.泛化(继承)generalization: 实线+三角箭头

public class ZhangSan {
private String idCard; public ZhangSan(String idCard) {
this.idCard = idCard;
} public void setIdCard(String idCard) {
this.idCard = idCard;
}
public String getIdCard() {
return idCard;
}
}

Zhangsan类继承Person类,Person是Zhangsan的泛化,表示关系用实线的三角箭头关联

2. 实现realization: 虚线 + 三角箭头

public interface Human {
public void eat();
}
public class Man implements Human{
public void eat() {
System.out.println("man eat foot");
}
}

Man实现Human接口,实现和泛化是比较简单的两种类与类之间的关系

3. 关联association:实线 + 箭头

public class ZhangSan {
private String idCard;
public Study study; public ZhangSan(String idCard) {
this.idCard = idCard;
} public void setIdCard(String idCard) {
this.idCard = idCard;
}
public String getIdCard() {
return idCard;
} public Study getStudy() {
return study;
}
public void setStudy(Study study) {
this.study = study;
}
}
public class Study {
public void studyEnglish() {
System.out.println("study English");
}
public void studyChinese() {
System.out.println("study Chinese");
}
}

Zhangsan中有一个study属性,该属性是Study类的一个实例,Zhangsan类和Study类之间的关系为关联关系

4. 聚合aggregation:空菱形 + 实线

public class Car {
public Wheel wheel;
public Engine engine; public void setWheel(Wheel wheel) {
this.wheel = wheel;
}
public Wheel getWheel() {
return wheel;
} public void setEngine(Engine engine) {
this.engine = engine;
}
public Engine getEngine() {
return engine;
}
} public class Wheel { } public class Engine { }

聚合表示的是整体和部分的关系,但是这种整体和部分的关系是可以拆分的且部分的内容是可以单独存在的,这种关系的代码实现类似于多个关联。

5. 组合compostion 实菱形 + 实线

public class Persion {
public Head head;
public Leg leg;
public void setHead(Head head) {
this.head = head;
}
public Head getHead() {
return head;
} public void setLeg(Leg leg) {
this.leg = leg;
}
public Leg getLeg() {
return leg;
}
} public class Head { } public class Leg { }

Head类和Leg类是Person类的一部分,但是这部分不可以脱离Person单独存在,Person中的head、leg是Head、Leg类的两个例,代码实现上和聚合一样

6. 依赖dependency:虚线 + 箭头

public class Persion {
......public void callUp(Phone phone) {
phone.call();
}
} public class Phone {
public void call() {
System.out.println("call some one");
}
}

Person中新加一个callUp方法用来实现打电话功能,但是这个功能需要调用Phone类中的call方法,因此通过把phone实例通过参数传递到Person的callUp方法中,这种关系为依赖关系

最新文章

  1. C++设计模式-Bridge桥接模式
  2. .net字符串Gzip压缩和base64string转换:
  3. Asp.net MVC Razor模板引擎技巧分享
  4. Android Studio插件推荐(PreIOC,GsonFormat)
  5. 【随笔】mOnOwall添加端口映射
  6. Java中相等测试
  7. Linux Shell 脚本
  8. ACM高精度加减乘除模板
  9. C#_会员管理系统:开发三(修改密码)
  10. 看完这篇文章才对【GIT】有了大彻大悟的认识
  11. [BZOJ]1071 组队(SCOI2007)
  12. Yii2.0调用sql server存储过程并获取返回值
  13. Graham 扫描法找凸包(convexHull)
  14. 菜鸟入门【ASP.NET Core】8:Middleware管道介绍、自己动手构建RequestDelegate管道
  15. Python基础二字符串和变量
  16. python第一百零二天-----第十七周作业
  17. opencv中 int main(int argc,char* argv[])详解
  18. P3455 [POI2007]ZAP-Queries(莫比乌斯反演)
  19. 高级定时器TIM1&TIM8
  20. Comparing Differently Trained Models

热门文章

  1. docker for windows无法共享硬盘
  2. javascript引用"bug"带来的"继承"
  3. Odoo 14 Action URL 生成
  4. Javaweb03-servlet&filter
  5. 出票系统:根据淡旺季的月份和年龄,打印票价[课后练习] 出票系统:根据淡旺季的月份和年龄,打印票价[课后练习] 4 10旺季: 4 10旺季: 成人(18-60) : 60 成人(18-60):60 儿童(<18) :半价 儿童(<18):半价 老人(>60) :1/3 老人(>60):1/3 淡季: 淡季: 成人: 40 成人:40 其他: 20 其他:20
  6. codeforces600E Lomsat gelral【线段树合并/DSU】
  7. Git 06 分支
  8. java学习第一天.day01
  9. 面试突击78:@Autowired 和 @Resource 有什么区别?
  10. 解决:Error downloading packages: containerd.io-1.6.4-3.1.el7.x86_64: [Errno 256] No more mirrors to try.