统一建模语言(Unified Modeling Language,UML)是一种通用的建模语言,具有创建系统的静态结构和动态行为等多种结构模型的能力,具有可扩展性和通用性,适合于多种多变结构系统的建模。
统一建模语言的特点:
- 统一标准
- 面向对象
- 可视化、表达能力强
- 独立于过程
- 易掌握、易用
一、UML 组成元素
1、事物
1)结构事物
- 类(Class)
- 接口(Interface)
- 协作(Collaboration)
- 用例(User)
- 主动类(Active Class)
- 构件(Component)
- 制品(Arifact)
- 节点(Node)
2)行为事物
- 交互(Interaction)
- 状态机(State Machine)
- 活动(Activity)
3)分组事物:最主要的分组事物就是包
4)注释事物:UML 模型的解释部分
2、关系
1)依赖:实心箭头的虚线
2)关联和聚集:描述一组链,链是对象之间的连接
3)泛化:空心箭头的实线
4)实现:空心箭头的虚线
两种场景会用到实现
- 接口和实现他们之间的类或者构件
- 用例和实现用例的协作
3、图
|----|-----|------|------|------|----|------|
| 序号 | 图 | 需求分析 | 设计阶段 | 编码实现 | 测试 | 运行维护 |
| 1 | 用例图 | ✓ | | ✓ | | |
| 2 | 类图 | ✓ | ✓ | | | |
| 3 | 对象图 | ✓ | ✓ | ✓ | | |
| 4 | 包图 | | ✓ | ✓ | | |
| 5 | 构件图 | | ✓ | ✓ | | ✓ |
| 6 | 配置图 | | ✓ | ✓ | ✓ | ✓ |
| 7 | 活动图 | ✓ | ✓ | ✓ | | |
| 8 | 顺序图 | ✓ | ✓ | ✓ | ✓ | |
| 9 | 状态图 | ✓ | ✓ | ✓ | | |
| 10 | 合作图 | ✓ | ✓ | ✓ | ✓ | |
二、模型图
1、用例图(Use Case Diagram)
用例模型(Use Case Model)描述的是外部执行者所理解的系统功能 。主要用于需求分析阶段,是系统开发者和用户反复讨论,对需求规格说明书达成共识。
用例图的组成元素:1)方框符号代表系统;2)椭圆符号代表用例;3)人形符号代表执行者。他们之间的关系用连接线表示,其关系由连接线上的文字标明。
2、类图(Class Diagram)
用类和它们之间的关系描述系统一种图示,展示了系统中类的静态结构和类与类之间的相互联系,表示一个系统的逻辑结构。
类的图符中的属性只注明类型而不能有具体值。
类的图符分为长式和短式:长式由类名、属性和操作组成;短式只有类名。
3、对象图(Object Diagram)
对象是类的实例,及时地反映了系统执行到某处时系统的工作状况。
对象的图符中,也分为长式和短式,对象名加了下划线,对象名后面可以接冒号和类名,用来说明创建该对象的类。
4、包图(Package DIagram)
包是一种组合结构,包由关系密切的一组模型元素组成,还可以由其他包嵌套构成。
包将许多累集合成一个更高层次的单位,形成一个高内聚、低耦合的类集合,降低系统的复杂性。
构件的组成元素:
- 公有访问(+)
- 私有访问(-)
- 保护访问(#)
包之间的关系:泛化和依赖
5、构件图(Component Diagram)
构件图又称为组件图,显示代码本身的逻辑结构,描述系统中存在的软件结构以及他们之间的依赖关系。
构件图的组成元素:构件、依赖关系、界面
构件是系统体系结构中独立的物理可替换单位,代表系统的一个物理模块,表达的是系统代码本身的结构。是包与类对应的物理代码模块,逻辑上与包、类对应,实际上是一个文件。
6、配置图(Deployment Diagram)
配置图描述了系统中硬件和软件的物理配置情况和系统体系结构,显示系统运行时刻的结构。
配置图的组成元素有结点和连接
配置图中的结点代表计算机资源,通常是服务器、客户机等硬件,结点包括其上运行的软件结构以及对象。各结点之间的连接是交互的通信路径,例如:TCP/IP,NFS,FUSE 等协议。
7、顺序图(Sequence Diagram)
顺序图用来描述对象之间动态的交互关系,着重体现对象间消息传递的时间顺序。顺序图存在两个轴:水平轴表示不同的对象,垂直轴表示时间。
8、合作图(Collaboration Diagram)
合作图也称协作图,用于描述相互合作的对象间的交互关系和连接关系。
合作图的组成元素是对象图,箭头表示对象间的消息流向,消息箭头必须附加标记,索命消息发送的先后顺序,还可以显示条件、重复和回送值。
9、状态图(State Diagram)
状态图用来描述一个特定对象的所有可能的状态及其引起状态迁移的事件。
状态图的组成元素:1)状态;2)迁移(附有文字说明);3)起始状态;4)结束状态
并不是所有的对象都能画状态图,只有具有个数限制、意义明确的状态的对象,并且其行为受不同轧辊太的影响而发生改变的对象,才需要画状态图。
1)事件
2)状态迁移
3)迁移动作
10、活动图(Activity Diagram)
活动图由状态图变化而来,各自用于不同目的。状态图着重描述对象的状态变化以及触发状态变化的事件;交互模型(顺序图和合作图)则描述对象之间的动态交互行为;活动图描述系统中各种活动的执行顺序,刻画一个方法中所要进行的各项活动的执行流程。
活动图的组成元素:1)活动;2)初态;3)终态;4)判断;5)同步
三、视图模型
模型的四个视图:逻辑视图、开发视图、过程视图、物理视图。统一的场景(scenarios)。
- 场景(用例视图)
描述系统的功能需求,展示外部用户能够观察到的系统功能模型,例如:用例图。
- 逻辑视图
描述如何实现系统内部的功能,系统的静态结构和动态协作关系,包括有类图、对象图、状态图、顺序图、合作图、活动图等
- 开发视图(实现试图)
描述系统代码构件组织和实现模块以及他们之间的依赖关系,例如:构件图。
- 过程视图(进程视图)
描述系统的并发性,并处理这些线程间的通信和同步,将系统分割成并发执行的控制线程以及处理这些线程的通信和同步,包括:状态图、顺序图、合作图、活动图、构件图、配置图。
- 物理视图(部署试图)
定义系统中软硬件的物理体系结构及连接、哪个程序或对象驻留在哪台计算机上执行,配置图。
四、设计模式
设计模式(Design pattern)代表了最佳的实践,通常被有经验的面向对象的软件开发人员所采用。设计模式是软件开发人员在软件开发过程中面临的一般问题的解决方案。这些解决方案是众多软件开发人员经过相当长的一段时间的试验和错误总结出来的。
设计模式是一套被反复使用的、多数人知晓的、经过分类编目的、代码设计经验的总结。使用设计模式是为了重用代码、让代码更容易被他人理解、保证代码可靠性。
1、创建型设计模式
创建型设计模式提供了一种在创建对象的同时隐藏创建逻辑的方式,而不是使用 new 运算符直接实例化对象。这使得程序在判断针对某个给定实例需要创建哪些对象时更加灵活。
- 工厂模式(Factory Pattern)
- 抽象工厂模式(Abstract Factory Pattern)
- 单例模式(Singleton Pattern)
- 建造者模式(Builder Pattern)
- 原型模式(Prototype Pattern)
2、结构型设计模式
结构型模式关注对象之间的组合和关系,旨在解决如何构建灵活且可复用的类和对象结构。
- 适配器模式(Adapter Pattern)
- 桥接模式(Bridge Pattern)
- 过滤器模式(Filter、Criteria Pattern)
- 组合模式(Composite Pattern)
- 装饰器模式(Decorator Pattern)
- 外观模式(Facade Pattern)
- 享元模式(Flyweight Pattern)
- 代理模式(Proxy Pattern)
3、行为型模式
行为型模式关注对象之间的通信和交互,旨在解决对象之间的责任分配和算法的封装。
- 责任链模式(Chain of Responsibility Pattern)
- 命令模式(Command Pattern)
- 解释器模式(Interpreter Pattern)
- 迭代器模式(Iterator Pattern)
- 中介者模式(Mediator Pattern)
- 备忘录模式(Memento Pattern)
- 观察者模式(Observer Pattern)
- 状态模式(State Pattern)
- 空对象模式(Null Object Pattern)
- 策略模式(Strategy Pattern)
- 模板模式(Template Pattern)
- 访问者模式(Visitor Pattern)
4、设计模式的六大原则
1)开闭原则(Open Close Principle)
开闭原则的意思是:对扩展开放,对修改关闭。在程序需要进行拓展的时候,不能去修改原有的代码,实现一个热插拔的效果。简言之,是为了使程序的扩展性好,易于维护和升级。想要达到这样的效果,我们需要使用接口和抽象类,后面的具体设计中我们会提到这点。
2)里氏代换原则(Liskov Substitution Principle)
里氏代换原则是面向对象设计的基本原则之一。 里氏代换原则中说,任何基类可以出现的地方,子类一定可以出现。LSP 是继承复用的基石,只有当派生类可以替换掉基类,且软件单位的功能不受到影响时,基类才能真正被复用,而派生类也能够在基类的基础上增加新的行为。里氏代换原则是对开闭原则的补充。实现开闭原则的关键步骤就是抽象化,而基类与子类的继承关系就是抽象化的具体实现,所以里氏代换原则是对实现抽象化的具体步骤的规范。
3)依赖倒转原则(Dependence Inversion Principle)
这个原则是开闭原则的基础,具体内容:针对接口编程,依赖于抽象而不依赖于具体。
4)接口隔离原则(Interface Segregation Principle)
这个原则的意思是:使用多个隔离的接口,比使用单个接口要好。它还有另外一个意思是:降低类之间的耦合度。由此可见,其实设计模式就是从大型软件架构出发、便于升级和维护的软件设计思想,它强调降低依赖,降低耦合。
5)迪米特法则,又称最少知道原则(Demeter Principle)
最少知道原则是指:一个实体应当尽量少地与其他实体之间发生相互作用,使得系统功能模块相对独立。
6)合成复用原则(Composite Reuse Principle)
合成复用原则是指:尽量使用合成/聚合的方式,而不是使用继承。