前言: 笔者辞职后出去玩了一圈,直到上周六回来,开始准备面试找工作,在准备的过程中回顾了一下以往写的博客中的知识点,发现最开始写的那版设计模式一点也不好。不好在哪里呢?第一示例的命名不够通俗易懂。第二举的例子笔者感觉不是很贴切,还不够靠近生活。第三,没有设计模式之间的特点比对,或者说是优缺点的对比。所以笔者准备废弃最早写的那版设计模式,重新写一版且长期维护,这样更方便差缺补漏。俗话说得好,罗马不是一天建成的,所以要慢慢写~(完美掩盖笔者学渣且懒的特质)
原来参考的是设计模式与游戏完美开发
新版参考的是大话设计模式写最专业的博客笔者还有很大差距的,但是写最有趣的技术博客我还是可以试一试的~
有说的不正确或者不准确的地方欢迎留言指正
有什么有趣的写作技巧或者想法欢迎大家给我留言,大家的帮助是我写下去最有效的动力
进入正题: UML类图可以按照指定的图形规则,有效的表示出类与类直接的关系,就像五线谱一样,按照指定规则的书写,阅读者就知道对应的曲调,当然前提你也得会,反正不管你们会不会,笔者我是不会~
笔者使用的UML画图工具是ProcessOn
VisualStudio 如何使用UML呢?请看雨兄的这篇文章VisualStudio中类设计器的使用
下面开始逐一讲解规则
类
public abstract class Newbie
{
/// <summary>
/// 姓名
/// </summary>
public string name = "菜鸟海澜";
/// <summary>
/// 有多少钱
/// </summary>
protected float money = -666.0f;
/// <summary>
/// 身份证号码
/// </summary>
private string IDNumber = "123456789";
public abstract void FindGoodWork0(string parameter = "钱多");
public abstract string FindGoodWork1(string parameter = "活少");
public abstract float FindGoodWork2( int[] distance, string parameter = "离家近" );
}
对应的类图
- 第一行显示类名
- 第二行显示类的特性,通常就是字段和属性
- 第三行就是操作,通常是方法或行为
- +代表public
- -代表private
- #代表protected
- 如果是抽象类,用斜体显示
- UML规定属性的表示方式为:可见性 名称:类型 [ = 缺省值 ]
- “可见性”表示该属性对于类外的元素而言是否可见,包括公有(public)、私有(private)和受保护(protected)三种,在类图中分别用符号+、-和#表示。
- “名称”表示属性名,用一个字符串表示。
- “类型”表示属性的数据类型,可以是基本数据类型,也可以是用户自定义类型。
- “缺省值”是一个可选项,即属性的初始值。
- UML规定操作的表示方式为:可见性 名称(参数列表) [ : 返回类型]
- “可见性”的定义与属性的可见性定义相同。
- “名称”即方法名,用一个字符串表示。
- “参数列表”表示方法的参数,其语法与属性的定义相似,参数个数是任意的,多个参数之间用逗号“,”隔开。
- “返回类型”是一个可选项,表示方法的返回值类型,依赖于具体的编程语言,可以是基本数据类型,也可以是用户自定义类型,还可以是空类型(void),如果是构造方法,则无返回类型。
接口
public interface IUnity
{
void PlayUnity();
}
对应的接口图
- 第一行是接口名称
- 第二行是几口方法
也可以用棒棒糖表示法
public class Unity : IUnity
{
public void PlayUnity()
{
Debug.Log("使用Unity");
}
}
- “棒棒糖”表示接口
- 圆圈旁边为接口名称
- 接口方法在实现类中出现
继承
public class HaiLan : Newbie
{
public override void FindGoodWork0(string parameter = "钱多")
{
}
public override string FindGoodWork1(string parameter = "活少")
{
return "";
}
public override float FindGoodWork2(int[] distance, string parameter = "离家近")
{
return 0.0f;
}
}
实现接口
关联关系
public class Unity : IUnity
{
public Csharp learnCsharp;
public void PlayUnity()
{
Debug.Log("使用Unity");
}
}
public class Csharp
{
}
当一个类中引用另一个类的时候是引用关系
聚合关系
public class Math3D
{
}
public class Unity1
{
public Math3D math3D;
}
聚合关系可以理解为一直较弱的关联 ,表示一种状态,例如使用Unity3D中可以会3D数学,但是呢也不能说不会3D数学你就不能用Unity,你可以弄点UI、写写编辑器什么的。这种特殊的状态强调独立性,这种独立性体现在他们的都有各自的生命周期,例如我会3D数学可以用在DirectX,不一定要在Unity3d中使用,但是呢Unity3d可以含有3D数学
合成关系
public class UnityLifeCycle
{
}
public class Unity2
{
public UnityLifeCycle unityLifeCycle;
public Unity2()
{
unityLifeCycle = new UnityLifeCycle();
}
}
合成(组合)关系 是一种强的拥有关系,他们生命周期共存,同生共死,不可单独存在。例如unity中特定函数的生命周期(Awake 、Start等),在其他游戏引擎中是无用的,不能存在的,反正unity离开这些也是不行的。
依赖关系
public class API
{
}
public class VersionChange
{
public void Change(API api)
{
}
}
依赖关系(Dependency) 是一种使用关系,特定事物的改变有可能会影响到使用该事物的其他事物,在需要表示一个事物使用另一个事物时使用依赖关系。大多数情况下,依 赖关系体现在某个类的方法使用另一个类的对象作为参数。
重数性关联
public class Eye
{
}
public class People
{
public Eye[] eye;
public People()
{
eye = new Eye[2];
}
}
重数性关联关系又称为多重性关联关系(Multiplicity),表示一个类的对象与另一个类的对象连接的个数。在UML中多重性关系可以直接在关联直线上增加一个数字表示与之对应的另一个类的对象的个数。
1和2被称为基数 表明这一段的类可以有几个实例,同样适用于聚合关系金和合成关系,最下方为多重性表示方式表格。
表示方式 | 多重性说明 |
---|---|
1..1 | 表示另一个类的一个对象只与一个该类对象有关系 |
0..* | 表示另一个类的一个对象与零个或多个该类对象有关系 |
1..* | 表示另一个类的一个对象与一个或多个该类对象有关系 |
0..1 | 表示另一个类的一个对象没有或只与一个该类对象有关系 |
m..n | 表示另一个类的一个对象与最少m、最多n个该类对象有关系 (m<=n) |
线段含义总览
不知道大家有没有发现其中的规律
- 关于描述“实现”这种的”都是三角箭头,继承这种紧密的关系用的是实线,接口这种相对松散的关系用的是松散的虚线
- 关于描述“关系”的都是用>(大于号)这种箭头,弱的聚合关系用的是空闲的三角箭头,强的组合关系用的是实心的三角箭头