一、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、行为型模式
类模式(解释器模式、模板方法械)
对象模式(命令模式、职责链模式、迭代器模式、状态模式、中介模式、观察者模式。策略模式、访问者模式、备忘录模式。
例如:简单工厂模式
主要用于创建对象,新添加类时,不会影响以前的系统代码。核心思想是用一具工厂来根据输入的条件产生不同的类,然后根据不同类的virtual函数得到不同的结果。
优点:适用于不同情况创建不同的类时。
缺点:客户端必须要知道基类和工厂类,耦合性井。需要根据不同需求创建不同的类,添加类的时候需要爱护工厂类。
小学生的四则运算法则为例,对应UML.类如下:
下面简单做一个UML模型和C++类实例来实现一下
代码实现:
头文件:
// 设计操作基类 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; }
源文件:
#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; }