【第一天】设计模式之基础-UML类图与设计模式七大原则

前言

UML类图用来表示类与类之间的关系,是一种静态图(区别于对象图,对象图描述的是某一时刻对象与对象之间的关系)。能够理解UML类图,是学习设计模式的基础,看懂了类图,就能够更好的理解设计模式,学习起来事半功倍。

一、UML类图如何表示一个类?

在这里插入图片描述

一个类图从上到下的矩形分别表示类名、 属性、方法,在属性和方法前面的+ - # ~ 表示如下表所示:

符号 含义
+ public,公开的,所有的类均可访问
- private,私有的,仅本类可访问
# protected,受保护的,本包类、子类可访问
~ default,包的,本包类可访问、子类不可访问

注意,如果一个类的名称是斜体字,则该类就是抽象类。
类图除了能够表示一类之外,还可以表示一个接口,接口从上到下的矩形分别表示接口名称和接口方法。类图表示接口通常有两种表示方法,第一种在类名上添加<<interface>>,表明这是一个接口,如下图所示。
在这里插入图片描述

另外一种表示方法俗称为‘棒棒糖表示法’,在类图上添加一个类似与棒棒糖的图示,如下图所示。
在这里插入图片描述

二、UML类图如何表示类与类之间的关系?

UML类图,类与类之间的关系如下表所示。

关系 含义 符号表示
继承 一种继承关系,表示一般与特殊的关系,它指定了子类如何特化父类的所有特征和行为。谁指向谁表明谁继承了谁。继承有一般也用泛化表示,继承是泛化的一种表现形式,泛化一般表现为继承或者实现。继承符号表示为实线三角箭头。 在这里插入图片描述
实现 一种类与接口的关系,表示类是接口所有特征和行为的实现。谁指向谁表明谁实现了谁。实现符号表示为虚线三角箭头。 1
关联 一种拥有的关系,它使一个类知道另一个类的属性和方法。关联分为单向关联和双向关联,用实线和实线箭头分别表示双向关联和单向关联。 在这里插入图片描述
聚合 整体与部分的关系,且部分可以离开整体而单独存在。聚合是关联的一种特殊形式,是一弱的关联。用菱形空心表示聚合符号。 在这里插入图片描述
组合 整体与部分的关系,但部分不能离开整体而单独存在。组合也是关联的一种特殊形式,是一种强关联。用菱形实心表示组合关系。 在这里插入图片描述
依赖 一种使用的关系,即一个类的实现需要另一个类的协助。用虚线箭头表示依赖关系。 在这里插入图片描述

UML图示样例如下图所示。
在这里插入图片描述

1、继承关系如何用代码表示

在这里插入图片描述

public class Animal{
    
    
	.......
}

public class Bird extends Animal{
    
    //使用关键字extends表明Bird类继承了Animal类

}

在Java语言中,使用extends 表明继承关系。鸟是动物的一种,所以鸟继承了动物。

2、实现关系如何用代码表示

在这里插入图片描述

public interface Fly{
    
    
	...
}

public class Goose implements Fly{
    
    //使用implements关键字表明大雁类实现了飞翔接口
	...
}

在Java语言中,使用interface表明谁实现了谁。

3、关联关系如何用代码表示

在这里插入图片描述

public class Penguin{
    
    
	puiblic Climate climate;//定义一个气候类,与企鹅类关联
	......
}

public class Climate{
    
    
	......
}

在企鹅类中定义了气候类,那么企鹅类就关联了气候类,这时候企鹅类知道气候类的变化,如果一个类中定义了另外一个类,这个类了解另外一个类的变化,并且是类的属性的一部分(整体与部分的关系),我们叫做类与类的关联关系。

4、聚合关系如何用代码表示

在这里插入图片描述

public class GooseGroup{
    
    
	List<Goose> gooseList;//定义一个大雁list

	public void addGoose(Goose gooses){
    
    //雁群添加大雁,大雁也可以离开雁群
			this.gooseList.add(gooses);
	}
}

public class Goose interface Fly{
    
    //使用interface关键字表明大雁类实现了飞翔接口
	...
}

从代码中我们可以看到,GooseGroup(雁群)对象与Goose(大雁)对象是一个1对多的关联关系,但是大雁的生命周期不是在雁群里面产生的(没有在雁群里面new),从外部传入,即大雁的生命周期是不受雁群影响的,GooseGroup(雁群)对象没有了(置为null)Gooses(大雁)对象不受影响,依旧可以在外部使用Goose对象。聚合关联是关联关系的一种特殊形式,但类与类之间关系还没有这么紧密,各自拥有各种的生命周期。

5、组合关系如何用代码表示

在这里插入图片描述

public class Bird{
    
    
	public Wing leftWing;
	public Wing rightWing;

	public Bird(){
    
    
		//鸟在创建的时候就拥有翅膀
		leftWing = new Wing();
		rightWing = new Wing();
	}
}

public class Wing{
    
    
	....
}

从代码中我们可以看到,Bird(鸟)对象中的Wing(翅膀)对象定义在Bird(鸟)对象的构造函数中,即Bird(鸟)对象在诞生时就拥有两个Wing(翅膀)对象,鸟类消亡时(置为null)时,Wing(翅膀)对象也无法在外部继续使用,随着Bird(鸟)对象消亡。组合关系也是关联关系的一种特殊形式,但是他们之间的关联更加紧密,拥有相同的生命周期。

6、依赖关系如何用代码表示

在这里插入图片描述

public class Animal{
    
    
	....
	public void metabolism(O2 o2,Water water){
    
    /动物依赖氧气和水才能新陈代谢
			.....
	}
	public void eat(){
    
    
		Food food = new Food();//动物吃东西依赖食物
	}
}
public class O2{
    
    
	...
}
public class Water{
    
    
	...
}
public class Food(){
    
    
	...
}

从代码中可以看到,Animal(动物)对象在进行metabolism(新陈代谢操作)时,需要依赖O2(氧气)对象和Water(水)对象才能完成;Animal(动物)在进行进食操作时依赖Food对象才能完成。类的依赖关系表明了类进行一个操作依赖了另外一个类才能完成,即被依赖的类都在都是局部变量类,他不是类的一部分(不是类的属性,如果为类的属性就是关联关系),类的操作需要另外一个类协助。

设计模式七大原则

设计模式七大原则如下表所示:

原则 简单概念
开闭原则 一个类应该对修改关闭,对扩张开放,避免修改已经稳定的类,而是对类进行扩张
单一职责 类的功能职责应该单一,不要把太多职责放到类中。
依赖倒置原则 高层模块不应该依赖低层模块,它们都应该依赖抽象。抽象不应该依赖于细节,细节应该依赖于抽象。
接口隔离原则 客户端不应该依赖那些它不需要的接口。一旦一个接口太大,则需要将它分割成一些更细小的接口,使用该接口的客户端仅需知道与之相关的方法即可。
里氏替换原则 一个父类可以出现的地方,子类必定可以出现。
迪米特法则 即最小知识原则,每一个对象都对其他对象保持最小了解。
合成复用原则 尽量使用对象组合,而不是继承来达到复用的目的。

总结

学习UML类图,能够看懂UML类是学习设计模式的基础。能够看懂UML类图,对于理解记忆设计模是事半功倍的。重点要记住UML类图的符号表示以及各种UML类图之间类与类之间的关系,一看到UML图脑海中能够映射出响应的代码结构。


猜你喜欢

转载自blog.csdn.net/yuwusheng18/article/details/111316415