uml结构建模_uml面向对象分析建模与设计

2022-09-23 20:52:18 浏览数 (1)

大家好,又见面了,我是你们的朋友全栈君。

文章目录

  • 一、UML建模与架构文档化
    • 1、UML应用与未来
    • 2、UML基础
      • a.用例和用例图
      • b.交互图
      • c.类图与对象图
    • 3、基 于 UML 的软件开发过程
    • 4、系统架构文档化
  • 二、设计模式类之间的关系及原则
    • 一、类之间的关系(我拿Visio作图举例)
      • 1.继承关系
      • 2、实现关系
      • 3、依赖关系
      • 4、关联关系
      • 5、聚合关系
      • 6、组合关系
    • 二、设计模式的原则(简单列出)
    • 三、设计模式
      • 1.创建型模式
      • 2、结构型模式
      • 3、行为型模式
  • 下面简单做一个UML模型和C 类实例来实现一下

一、UML建模与架构文档化

1、UML应用与未来

从UML的早期版本开始, 便受到了计算机产业界的重视, OMG 的采纳和大公司的支持把 它推上了实际上的工业标准的地位, 使它拥有越来越多的用户。 它被广泛地用于应用领域和多 种类型的系统建模, ,如管理信息系统、 通信与控制系统、 嵌入式实时系统、分布式系统和系 统软件等。 近几年还被运用于软件再工程、 质量管理、 过程管理和配置管理等方面。 而且它 的应用不仅仅限于计算机软件, 还可用于非软件系统, 例如硬件设计、 业务处理流程、 企业 或事业单位的结构与行为建模。

2、UML基础

a.用例和用例图

用例(usecase) 图内也翻译为用况、 用案等, 在 UML 中, 用例用一个椭圆表示,用例名往往用动 宾结构或主谓结构命名。

b.交互图

交互图 (interaction diagram) 是用来描述对象之间以及对象与参与者(actor) 之间的动态协作关系 以及协作过程中行为次序的图形文档。 它通常用来描述一个用例的行为,显示该用例中所涉及的对象和这 些对象之间的消息传递。交互图包括顺序图(sequence diagram) 和 协作图(collaboration diagram) 两种形式。 顺序图着重描述对象按照时间顺序的消息交换, 协作图着重描述系统成分如何协同工作。 顺 序图和协作图从不同的角度表达了系统中的交互和系统的行为, 它们之间可以相互转化。 一个用例需要多 个顺序图或协作图, 除非特别简单的用例。

c.类图与对象图

类是具有相似结构、 行为和关系的一组对象的抽象。 在定义类的时候, 类的命名应尽量用应用领域中的术语, 应明确、 无歧义, 以利于开发人员与用户之间的相互理 解和交流。 一般而言, 类的名字是合关系。 d.状态图和活动图

3、基 于 UML 的软件开发过程

UML是独立于软件开发过程的, 即 UML 能够在几乎任何一种软件开发过程中使用。迭代的渐进式软 件开发过程包含 4 个阶段, 即初启、 细化、 构建和部署。

4、系统架构文档化

软件架构用来处理软件高层次结构的设计和实施。 它以精心选择的形式将若干结构元素进行装配, 从 而满足系统主要功能和性能需求, 并满足其他非功能性需求, 如可靠性、 可伸缩性、 可移植性和可魚性。 Peny 和 Wolfe 使用一个精确的公式来表达, 该公式由 Boehm 做了进一步修改。 软件架构={元素, 形式, 关系/约束} 软件架构涉及到抽象、 分解和组合、 风格和美学。 我们用由多个视图或视角组成的模型来描述它。

二、设计模式类之间的关系及原则

一、类之间的关系(我拿Visio作图举例)

1.继承关系

是一个类(子接口,或子类)继承另-一个类(父接口,或父类)的功能,并可以增加它自己的新功能的能力。通过UML类图设计,继承用一条带空心三角箭头的实线表示,从子类指向父类,或者子接口指向父接口。

2、实现关系

实现指的是一个class类实现interface接口 (可以是多个)的功能,实现是类与接口之间最常见的关系。在C 中并没有接口的关键字,这种关系一般是通过声明纯虚函数来实现。 通过UML类图设计,实现是用一条带空心三角箭头的虚线表示,从类指向实现的接口。

3、依赖关系

就是一个类A使用到另一个类B, 而这种使用关系是具有偶然性、临时性、非常弱的,但是B类的变化会影响到类A。 在UML图类设计中,依赖关系用由类A指向类B的带前头虚线表示。

4、关联关系

体现的是两个类之间语义级别的一种强依赖关系,一般是长期性, 而且双方的关系是平等。关系可以是单向,双向的。 使用UML类图设计,关联关系用由关联类A指向被关联类B的带箭头实线表示,在关联的两端可以标注双方的角色和多重性标记。

上方可标注

5、聚合关系

是关联关系的一一种特例,它体现的是整体与部分的关系,即Has A关系。此时整体与部分之间是可分离的,它们 可以具有各大自的生命周期,部分可以属于多个整体对象,也可以为多个整体对象共享。 在UML类图设计中,聚合关系以空心菱形加实线箭头表示。

6、组合关系

也是关联关系的一种特例,它体现的是一种contains- -a的关系,这种关系比聚合关系更强,也成为强聚合。 在UML.类图中,组合关系以实心萎形加实线箭头表示。

二、设计模式的原则(简单列出)

  1. 单一职責原则
  2. 开放-封闭原则
  3. 依赖倒转原则
  4. 里氏代换原则
  5. 接口隔离原则
  6. 迪米特法则

三、设计模式

1.创建型模式

类模式(工厂方法模式) 对象模式(抽象工厂模式、建造者模式、原型模式、单例模式)

2、结构型模式

类模型(类,适配器模式) 对象模式(适配器模式、桥接模式、组合模式,外观模式、装饰模式,享元模式、代理模式)

3、行为型模式

类模式(解释器模式、模板方法械) 对象模式(命令模式、职责链模式、迭代器模式、状态模式、中介模式、观察者模式。策略模式、访问者 模式、备忘录模式。 例如:简单工厂模式 主要用于创建对象,新添加类时,不会影响以前的系统代码。核心思想是用一具工厂来根据输入的条件产 生不同的类,然后根据不同类的virtual函数得到不同的结果。 优点:适用于不同情况创建不同的类时。 缺点:客户端必须要知道基类和工厂类,耦合性井。需要根据不同需求创建不同的类,添加类的时候需要 爱护工厂类。

小学生的四则运算法则为例,对应UML.类如下:

下面简单做一个UML模型和C 类实例来实现一下

代码实现: 头文件:

代码语言:javascript复制
// 设计操作基类
template <typename T>
class COperator
{ 
   
public:
	virtual T getResult() = 0;
	virtual void setArgs(T lpa, T rpa);
	
protected:
	T lah, rah;
};

template <typename T>
void COperator<T>::setArgs(T lpa,T rpa)
{ 
   
	lah = lpa;
	rah = rpa;
}


// 加法模板类
template<typename T>
class CAddOperator :public COperator<T>
{ 
   
public:
	virtual T getResult()
	{ 
   
		return COperator<T>::lah   COperator<T>::rah;
	}
};

// 减法模板类
template<typename T>
class CSubOperator :public COperator<T>
{ 
   
public:
	virtual T getResult()
	{ 
   
		return COperator<T>::lah - COperator<T>::rah;
	}
};

// 乘法模板类
template<typename T>
class CMulOperator :public COperator<T>
{ 
   
public:
	virtual T getResult()
	{ 
   		
		return COperator<T>::lah * COperator<T>::rah;
	}
};

// 除法模板类
template<typename T>
class CDivOperator :public COperator<T>
{ 
   
public:
	virtual T getResult()
	{ 
   
		if (0 == COperator<T>::rah)
		{ 
   
			std::cout << "除数不能为0" << std::endl;
			return 0;
		}
		return COperator<T>::lah / COperator<T>::rah;
	}
};

// 工厂类
template<typename T>
class CCalculatorFactory
{ 
   
public:
	static COperator<T>*createOjbect(char c);
};


template<typename T>
COperator<T> *CCalculatorFactory<T>::createOjbect(char c)
{ 
   
	COperator<T> *oper;
	switch (c)
	{ 
   
	case ' ':
		oper = new CAddOperator<T>();
		break;
	case '-':
		oper = new CSubOperator<T>();
		break;
	case '*':
		oper = new CAddOperator<T>();
		break;
	case '/':
		oper = new CAddOperator<T>();
		break;

	default:
		oper = new CAddOperator<T>();
		break;
	}

	return oper;
}

源文件:

代码语言:javascript复制
#include <iostream>
#include "SFMHeader.h"
using namespace std;

int main()
{ 
   
	// 创建对象
	COperator<double> *p = CCalculatorFactory<double>::createOjbect(' ');
	p->setArgs(23884.89989, 4324.234234);
	cout <<"两数相加结果为:"<<p->getResult() << endl;

	delete p;

	return 0;
}

发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/170900.html原文链接:https://javaforall.cn

0 人点赞