设计模式 - UML类图

UML:统一建模语言,是一种用于软件系统分析和设计的语言工具,它用于帮助软件开发人员进行思考和记录思路的结果。

UML图分类:

  • 用例图
  • 静态结构图:类图、对象图、包图、组件图、部署图
  • 动态行为图:交互图(时序图与协作图)、状态图、活动图

类图是描述类与类之间的关系的,是UML图中最核心的。

类之间的关系:依赖、泛化(继承)、实现、聚合、组合、关联。

聚合和组合:

  • 聚合是一种特殊的关联关系,表示一个整体与其部分之间的关系。在UML中,聚合关系用带有空心菱形的实线表示,菱形指向整体类。聚合关系表示整体和部分之间存在明确的包含关系,部分不能脱离整体而独立存在。例如,一个 Classroom 类可以包含多个 Student 类实例,表示班级中的学生。

  • 组合是聚合的一种特殊形式,表示整体与其部分之间的强依赖关系。在UML中,组合关系用带有实心菱形的实线表示,菱形指向整体类。组合关系表示整体和部分之间存在紧密的依赖关系,部分是整体不可或缺的一部分。例如,一个 Body 类可以组合多个 Organ 类实例,表示身体各个器官之间的紧密联系。

依赖

只要是在类中用到了对方,那么他们之间就存在依赖关系,如果没有对方,连编译都无法通过。

代码案例:

java 复制代码
// Person类
public class Person {
}
// PersonDao类
public class PersonDao {
}
// IDCard类
public class IDCard {
}
// Department类
public class Department {
}
// PersonServiceBean类
public class PersonServiceBean {
    private PersonDao personDao;

    public void save(){
        Person person = new Person();
    }
    public IDCard getIDCard(Integer personId){
        return new IDCard();
    }
    public void modify(){
        Department department = new Department();
    }
}

上诉代码中,PersonServiceBean就依赖了PersonDaoIDCardPersonDepartment。其实,可以将PersonServiceBeanPersonDao看作是一种聚合关系。

属于依赖关系的情况:

  • 类中用到了对方
  • 作为类的成员属性
  • 作为方法的返回类型
  • 作为方法接收的参数类型
  • 在方法中使用到

泛化

泛化实际上就是继承关系,它是依赖的一种特例。

代码案例:

java 复制代码
// Animal类
public abstract class Animal {
    String name;
    String age;
    public void eat(){
        System.out.println("eat..");
    }
    public abstract void sleep();
}
// Dog类
public class Dog extends Animal{
    @Override
    public void sleep() {
        System.out.println("sleep dog ...");
    }
}
// Cat类
public class Cat extends Animal{
    @Override
    public void sleep() {
        System.out.println("sleep cat ...");
    }
}

上诉代码中,DogCat继承于Animal,可以说AnimalDogCat之间是泛化关系。

属于泛化关系的情况:

  • 泛化关系实际上就是继承关系,如果A类继承了B类,我们就说A和B存在泛化关系。

实现

实现关系就是A类实现了B接口,它也是依赖关系的特例。

代码案例:

java 复制代码
// PersonService
public interface PersonService {
    int deletePerson(int id);
    int addPerson(int id, String name);
}
// PersonServiceImpl
public class PersonServiceImpl implements PersonService{
    @Override
    public int deletePerson(int id) {
        System.out.println("删除--"+id);
        return 0;
    }
    @Override
    public int addPerson(int id, String name) {
        System.out.println("新增--"+id+"--"+name);
        return 0;
    }
}

上诉代码中,PersonServiceImpl实现了PersonService接口,也就是PersonServicePersonServiceImpl之间存在实现关系。

关联

关联关系实际上就是类与类之间的联系,它也是依赖关系的特例。

关联关系具有导航性:即双向关系或单项关系。

关系具有多重性:如"1"(表示有且仅有1个),"0..."(表示0个或者多个),"0,1"(表示0个或者1个),"n...m"(表示n到m个都可以),"m...*"(表示至少m个)。

关系有:一对一、一对多、多对一、多对多。

代码案例:

java 复制代码
//  --------- 单向 一对一关系 -------------
// Person类
public class Person {
    private IDCard idCard;
}
// IDCard类
public class IDCard {
}
//  --------- 双向 一对一关系 -------------
// Person类
public class Person {
    private IDCard idCard;
}
// IDCard类
public class IDCard {
  	private Person person;
}

聚合

聚合关系表示的是整体和部分的关系,整体与部分可以分开。聚合关系是关联关系的特例,所以它具有关联的导航性和多重性。如:一台电脑由键盘、显示器、鼠标等组成,组成电脑等各个配件是可以从电脑上分离出来的。

代码案例:

java 复制代码
// Mouse类
public class Mouse {
}
// Moniter类
public class Moniter {
}
// Computer类
public class Computer {
    private Mouse mouse;  // mouse可以和computer分离
    private Moniter moniter;  // moniter可以和computer分离
   
    public void setMouse(Mouse mouse) {
        this.mouse = mouse;
    }
    public void setMoniter(Moniter moniter) {
        this.moniter = moniter;
    }
}

组合

组合关系表示的是整体和部分的关系,但是整体与部分不可以分开。组合关系也是关联关系的特例,所以它具有关联的导航性和多重性。如:一台电脑由键盘、显示器、鼠标等组成,组成电脑等各个配件是不可以从电脑上分离出来的。

代码案例:

java 复制代码
// Mouse类
public class Mouse {
}
// Moniter类
public class Moniter {
}
// Computer类
public class Computer {
    private Mouse mouse = new Mouse();  // mouse不可以和computer分离,因为computer创建时,mouse对象也就创建了
    private Moniter moniter = new Moniter;  // moniter不可以和computer分离
}
相关推荐
扣丁梦想家3 小时前
设计模式教程:命令模式(Command Pattern)
设计模式·命令模式
強云3 小时前
23种设计模式 - 迭代器模式
设计模式·迭代器模式
小王子10243 小时前
设计模式Python版 迭代器模式
python·设计模式·迭代器模式
道友老李3 小时前
【设计模式精讲】创建型模式之原型模式(深克隆、浅克隆)
设计模式·原型模式
攻城狮7号3 小时前
【第二节】C++设计模式(创建型模式)-抽象工厂模式
c++·设计模式·抽象工厂模式
TT-Kun4 小时前
设计模式 之 工厂模式(简单工厂模式、工厂方法模式、抽象工厂模式)(C++)
设计模式·简单工厂模式·工厂方法模式
FLZJ_KL4 小时前
【设计模式】【创建型模式】工厂方法模式(Factory Methods)
java·设计模式·工厂方法模式
強云4 小时前
23种设计模式 - 工厂方法模式
设计模式·工厂方法模式
強云5 小时前
23种设计模式 - 桥接模式
设计模式·桥接模式
workflower7 小时前
如何对比软件需求做的是否合格?
设计模式·软件工程·需求分析