我想完整记录一下Java版的设计模式的内容,本篇是关于UML类图,它与设计模式息息相关;或许这篇文章已经足够经典: 30分钟学会UML类图 - 知乎 (zhihu.com);如果不嫌弃也可以看看我这个,就是比较简单直接。
本文含有仓库链接:Java-设计模式,可以结合起来学习。
为什么要学UML图?我认为这是一种逻辑的体现,普通写Demo可能没有这种感觉,但当你学到深入时,必须重温设计模式。因为很多源码的底层(例如Spring、Mybatis...)就是一种设计模式的体现,而设计模式只是一种思想,根据这种思想选择合适的设计模式并改动,最终形成底层逻辑...,读源码很痛苦,我们将其抽象成逻辑图会帮助我们理解源码设计的思路,而这一切原来就是从基础又开始的,所以...再温一遍,反反复复。
优点:
- 逻辑清晰,从软件工程规范的角度,应该对系统有完整的设计(没点功力还真难构建呢)
- 便于分工
通用
符号含义:
+
表示public
;-
表示private
;#
表示protected
;- 不带符号表示
default
。
类
用于定义一个类的属性和方法。
UML
Java
public class Person {
private String name;
public String getName(){
return name;
}
public void setName(String name){
this.name = name;
}
}
接口
主要定义方法接口Interface
,让子类去实现该接口,做到多继承或者代码规范。
UML
Java
public interface PersonMapper {
public Person getUserByName(String userName);
}
实现
类通过implements
实现Interface
接口,并实现接口中的方法。
UML
Java
public class PersonMapperImpl implements PersonMapper {
@Override
public Person getUserByName(String userName) {
return null;
}
}
关联
A关联B,则B是作为A的属性存在,该属性也可以是A类中的局部变量,在局部中担属性存在。它有变种:聚合、组成、依赖。
UML
Java
public class Car {
private Tyre tyre;
}
public class Tyre {
}
依赖
A类中某个方法的参数需要传入B这个类。
UML
Java
public class PersonController {
public R save(Person person){
// 保存
return R.success();
}
}
这两个:“ 聚合 ” 与 “ 组成 ”经常傻傻分不清楚;关联中:依赖、聚合、组成,其实都是关联的另外三种形式,都是A类中含有B类,但是特点不一样。
- 聚合:A类中的属性含有B类,但是一般在外部将B初始化后,通过Set的方式或者A类的有参构造方法中传入。
- 组成:A类中的属性含有B类,且B类的初始化一般在A类的构造方法中随着A类一块初始化,与A同生同死。
- 依赖:一般是在A中的方法中使用,B类声明周期在A的方法中,A类本身不含B类的属性定义。
聚合
公司倒了,员工还在。
UML
Java
public class Company {
private Person person;
public void setPerson(Person person) {
this.person = person;
}
}
外部传入Person
public class Main {
public static void main(String[] args) {
Person person = new Person();
Company company = new Company();
company.setPerson(person);
}
}
组成
心脏...是鸟的组成部分,缺它不可,“ 我亡它亡 ”。
UML
Java
public class Bird {
private Heart heart;
public Bird() {
heart = new Heart();
}
}
心脏
public class Heart {
}
继承
子类可以得到父类所有(允许访问)的属性和方法。Java是单继承。,一个子类只能extends
一个父类。
UML
Java
public class Man extends Person {
private String gender;
public String getGender() {
return gender;
}
public void setGender(String gender) {
this.gender = gender;
}
}