UML类图

从油管里看到了个视频,虽然是个广告但感觉讲UML非常清晰,推荐下:UML Class Diagram Tutorial。能翻墙的场景不是很多,自己整理下方便日后直接看笔记,顺便写点自己的理解。


假设我们要建立一个动物园系统,根据这个动物园系统来详细讲述UML相关知识

基本特征

  动物园中有很多动物,为了描述这些动物,我们可以建一个动物类Animal,该类的实例将是某个特定的动物。
  我们可以通过属性(attributes)来确定Animal的每个实例。属性是一条重要数据,其中包含描述该类的每个实例的值。例如我们建立name、ID、age等属性,这样就可以确定一个具体的实例了。例如name小明、编号100、年龄10岁。这些属性都需要进行格式化。属性字段前面放可见性符号,属性名后面放数据类型,属性放在类图的中间。
  在类图的最下方我们放置方法或者函数。方法允许我们指定类的行为特征。方法也需要格式化,在方法前面放上可见性,后面加上括号表示这是函数,也可以添加变量和数据类型。
  上面提到的可见性,表示它的可访问性。-表示private,+表示public,#表示protected,~表示package或者default。
在这里插入图片描述

类的关系

继承

在这里插入图片描述
  继承就是子类和父类的关系。例如我们建立三个具体的动物类Dog、Cat、Snake继承Animal,那么这三个类就同时继承了name、id和age这三个属性。我们也可以单独给子类添加新属性,如Cat添加whiskerLength表示胡子长度。继承的优势在于我们想要为所有动物添加一个属性的时候,直接在Animal里增加即可,不至于去每个子类里添加,这就是抽象的优势。具体我们不会去实例一个Anilma类,而是实例化一个子类。

  继承使用的是空心箭头
在这里插入图片描述

关联

  关联是一种很弱的关系,用直线或者直线+箭头表示。例如我们建立一个mouse老鼠类。在Mouse和cat之间建立联系。我们说猫吃老鼠,但是不能说他俩之间有依赖关系。关联的对象之间没有任何强制约束,只要二者同意可以随时建立或者接触关联。
在这里插入图片描述

class CMouse
{
public:
	int32_t rp; 
public:
	CMouse()
	{
		rp = rand() % 10;
	}
};

class CCat
{
private:
	CMouse* m_pMouse;
public:
	CCat()
	{
		m_pMouse = nullptr;
	}
	void FindFood(CMouse* pMouse)
	{
		if (pMouse->rp >= 5)
		{
			m_pMouse = pMouse;
		}
	}
	void eatFood()
	{
		if (m_pMouse == nullptr)
		{
			cout << "真不走运,没吃的" << endl;
		}
		else
		{
			cout << "真好吃啊" << endl;
		}
	}
};

int main()
{
	srand((uint32_t)time(0));
	CCat cat;
	CMouse mouse;
	cat.FindFood(&mouse);
	cat.eatFood();
	return 0;
}

聚合

  聚合是一种强版本的关联类型,用来说明整体和部分的关系,被聚合的对象还可以被别的对象关联。举例如下。动物园建立了一个爬行动物馆,我们的Snake的一个实例就在爬行动物管里。但是Snake和爬行动物管并没用强依赖的关系,如果有一天爬行动物管不存在了,我们的Snake仍然存在(如果它没死的话2333).。这种一部分可以存在于整体之外的关系就是聚合,用空心菱形标记。
  聚合关系方便对象的管理,只需要操作大类即可。
在这里插入图片描述

class CSnake
{

};

class Reptilian
{
private:
	CSnake* arr[10];
public:
	Reptilian()
	{
		for (int i = 0; i < 10; i++)
		{
			arr[i] = 0;
		}
	}
	~Reptilian()
	{
		for (int i = 0; i < 10; i++)
		{
			delete arr[i];
		}
	}

	void PushSnake(CSnake* pSnake)
	{
		for (int i = 0; i < 10; i++)
		{
			if (arr[i] == 0)
			{
				arr[i] = pSnake;
				return;
			}
		}
	}
};

int main()
{
	CSnake* p1 = new CSnake;
	CSnake* p2 = new CSnake;
	CSnake* p3 = new CSnake;

	//蛇和爬行类聚合在一起,可以用一个爬行类来管理这里面所有的蛇
	Reptilian rp;
	rp.PushSnake(p1);
	rp.PushSnake(p2);
	rp.PushSnake(p3);


	return 0;
}

组合

  组合和聚合很容易分不清。组合关系也是表示整体和部分的关系,但是它要求部分不能脱离整体之外。组合关系用实心菱形表示。
  我们可以举例表达组合和聚合的关系。例如动物园里的访客中心、访客中心里的厕所、访客中心里的雇员。如果有一天访客中心要拆掉了,雇员并不会因为访客中心不存在了而消失,还依然存在,可以去其他部门或其他地方任职(聚合关系),但是访客中心里的厕所却要和访客中心大楼同归于尽了(组合关系)。

  具体到代码里,组合关系,实例的生命周期都是相同的。举一个最极端的例子,组合就是人和人的脑袋的关系。

class CHead
{
public:
	void say(){ 
		cout<<"我是个脑袋"<<endl;
	}
};

class CPerson
{
private:
	CHead m_cHead;
public:
	void Say()
	{
		cout << "说句话" << endl;
		m_cHead.say();
	}
};

int main()
{
	CPerson ps;
	ps.Say();
	return 0;
}

在这里插入图片描述

多重性

  在讨论关系的时候,另一个重要概念是多重性,我们可以在关系里设置数字约束。n表示有n个,n…*表示至少有n个,m…n表示实例数量在m到n之间

在这里插入图片描述

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
1.系统需求 2 2.需求分析 4 2.1功能设置 4 2.2模块划分 5 2.3识别参与者和用例 6 2.3.1 顾客Customer用例图 7 2.3.2 系统管理员用例 13 2.3 静态结构模型 16 2.3.1 类Customer 17 2.3.2类Goods 18 2.3.3类Order 19 2.3.4管理员 20 2.3.5标题title类 20 2.3.6二级标题类 21 2.3.7公共操作类 22 2.3.8类图 23 3.动态行为模式 23 3.1时序图 23 3.1.1顾客注册成为会员时序图 24 3.1.2顾客反馈信息时序图 25 3.1.3顾客浏览商品时序图 26 3.1.4顾客查询商品时序图 27 3.1.5顾客购买商品时序图 28 3.2.6管理员添加商品时序图 29 3.2.7管理员删除商品时序图 29 3.2.8管理员添加二级商品目录时序图 30 3.2.9管理员删除二级商品目录时序图 31 3.2.10管理员编辑促销产品时序图 31 3.2.11管理员编辑条款信息时序图 32 3.2.12管理员编辑购买流程时序图 33 3.2.13管理员删除会员时序图 34 3.2.14用户结算时序图 35 3.3.活动图 35 3.3.1用户顾客的活动图 35 3.3.2管理端管理员的活动图 36 3.4协作图 38 3.4.1顾客登录协作图 38 3.4.2顾客注册协作图 38 3.4.3顾客浏览商品协作图 39 3.4.4反馈信息协作图 39 3.4.5顾客查询商品协作图 40 3.4.6顾客购买商品协作图 40 3.4.7管理员删除会员协作图 41 3.4.8管理员添加商品协作图 41 3.4.9管理员添加商品标题协作图 42 3.4.10管理员删除商品协作图 42 3.4.11管理员删除标题协作图 43 3.4.12管理员编辑文本协作图 43 4.系统数据库设计 44 4.1数据库的需求分析 44 4.2数据库的逻辑设计 44 5.参考文献: 47
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值