第10章:UML建模
一、概述
统一建模语言(UML)是面向对象软件的标准化建模语言UML由3个要素成:UML的基本构造块、支配这些构造块如何放置在一起的规则和运用于整个语言的些公共机制。
UML的词汇表包含3种构造块:事物、关系和图。
事物是对模型中最具代表性的成分的抽象,关系把事物结合在一起,图聚集了相关的事物。
1、事物包括结构事物、行为事物、分组事物和注释事物。
- 结构事物(Structural Thing)。通常是模型的静态部分,描述概念或物理元素。结构事物包括类(Class)、接口(Interface)、协作(Collaboration)、用例(Use Case)、主动类(Active Class)、构件(Component)和 节点(Node)。
- 行为事物(Behavior Thing)。是UML模型的动态部分。它们是模型中的动词,描述了跨越时间和空间的行为。共有两类主要的行为事物:交互(Interaction)和状态机(StateMachine).
- 分组事物(Grouping Thing)。是UML模型的组织部分。它们是一些由模型分解成的盒子”。在所有的分组事物中,最主要的分组事物是包(Package)。
- 注释事物(Annotational Thing)。是UML模型的解释部分。这些注释事物用来描述、说明和标注模型的任何元素。注解(Note)是一.种主要的注释事物。注解是一个依附于一个元素或者一组元素之上,对它进行约束或解释的简单符号。
2、ML中有4种关系:依赖、关联、泛化和实现。
- 依赖(Dependency)。 依赖是两个事物间的语义关系,其中一个事物(独立事物)发生变化会影响另一个事物(依赖事物)的语义。
- 关联(Association)。关联是一种结构关系,它描述了一组链,链是对象之间的连接。聚合(Aggregation)是一种特殊类型的关联,它描述了整体和部分间的结构关系。组合(Composition)也是一种特殊类型的关联,它同样体现了整体与部分间的关系,但比聚合更强,也称为强聚合。
- 泛化(Generalization)。泛化是**一种特殊/一般关系,**特殊元素(子元素)的对象可替代一般元素(父元素)的对象。用这种方法,子元素共享了父元素的结构和行为。
- 实现(Realization)。实现是类元之间的语义关系,其中一个类元制定了由另一个类元保证执行的契约。在两种地方要遇到实现关系:一种是在接口和实现它们的类或构件之间;另一种是在用例和实现它们的协作之间。
二、类图
类图(Class Diagram)展现了一组对象、接口协作及其之间的关系。在面向对象系统的建模中所建立的最常见的图就是类图。
类图给出了系统的静态设计视图,包含主动类的类图给出了系统的静态进程视图。作为模型管理视图还可以含有包或子系统,二者都用于把模型元素聚集成更大的组块。
类图用于对系统的静态视图建模。这种视图主要支持系统的功能需求,即系统要提供给最终用户的服务。
当对系统的静态设计建模时,通常以下述3种方式之一使用类图:对系统的词汇建模;对简单的协作建模;对逻辑数据库模式建模。
考点:
1、填类名、方法名、属性名
2、填多重度
3、填关系
1:表示一个集合中的一个对象对应另一个集合中1个对象。
0…*:表示一个集合中的一个对象对应另一个集合中的0个或多个对象(可以不对应)。
1…*:表示一个集合中的一个对象对应另一个集合中的一个或多个对象(至少对应一个)。
*.表示一个集合中的一个对象对应另一个集合中的多个的对象。
三、用例图
用例图(Use Case Diagram)展现了一组用例、参与者(Actor)及两者之间的关系。用例图通常包括用例、参与者、扩展关系、包含关系,
用例图用于对系统的静态用例视图进行建模,主要支持系统的行为,即该系统在它的周边环境的语境中所提供的外部可见服务。
当对系统的静态用例视图建模时,可以用下列两种方式来使用用例图:对系统的语境建模;对系统的需求建模。
四、顺序图
顺序图(或称序列图)和协作图均被称为交互图,它们用于对系统的动态方面进行建模。
一张交互图显示的是一个交互,由一组对象及其之间的关系组成,包含它们之间可能传递的消息。
顺序图是强调消息时间序列的交互图,协作图则是强调接收和发送消息的对象的结构组织的交互图。
交互图用于对一个系统的动态方面建模。在大多数情况下,它包括对类接口、构件和节点的具体的或原型化的实例及其之间传递的消息进行建模。交互图可以单独使用,用于可视化、详述、构造和文档化一个特定的对象群体的动态方面,也可以用来对一个用例的特定控制流进行建模。
五、活动图
活动图(Activity Diagram)是一种特殊的状态图,它展现了在系统内从一个活动到另一个活动的流程。
活动图专注于系统的动态视图,它对于系统的功能建模特别重要,并强调对象间的控制流程。
六、状态图
状态图(State Diagram)展现了一个状态机,它由状态、转换、事件和活动组成。状态图关注系统的动态视图,对于接口、类和协作的行为建模尤为重要,引强调对象行为的事件顺序。
状态图通常包含简单状态和组合状态、转换(事件和动作)。
状态图关注系统的动态视图,它对接口、类和协作的行为建模尤为重要,它强调对象行为的事件顺序。
七、通信图
通信图(Communication Diagram)强调收发消息的对象的结构组织。通信图强调参加交互的对象的组织。
产生一张通信图,如图所示,首先要将参加交互的对象作为图的顶点,然后把连接这些对象的链表示为图的弧,最后用对象发送和接收的消息来修饰这些链。这就提供了在协作对象的结构组织的语境中观察控制流的一个清晰的可视化轨迹。
- 通信图有路径
- 通信图有顺序号
八、构件图
构件图(Component Diagram)展现了一组构件之间的组织和依赖。构件图专注于系统的静态实现视图。如图所示,它与类图相关,通常把构件映射为一个或多 个类、接口或协作。
第11章:面面向对象技术
一、基本概念
面向对象=对象+分类+继承+通过消息的通信
1、对象
在面向对象的系统中,对象是基本的运行实体,它既包括数据(属性),也包括作用于数据的操作(行为),所以一个对象把属性和行为封装为一个整体。从程序设计者角度看,对象是一个程序模块,从用户角度看,对象为他们提供了所希望的行为。在对象内的操作通常叫作方法。一个对象通常可由对象名、属性和操作3部分组成。
2、消息
对象之间进行通信的一种构造叫作消息。当一个消息发送给某个对象时,包含要求接收对象去执行某些活动的信息,接收到消息的对象经过解释,然后予以响应,这种通信机制叫作消息传递。发送消息的对象不需要知道接收消息的对象如何对请求予以响应。
3、类
一个类定义了一组大体上相似的对象,一个类所包含的方法和数据描述一组对象的共同行为和属性。类是在对象之上的抽象,对象是类的具体化,是类的实例。
4、继承
继承是父类和子类之间共享数据和方法的机制这是类之间的一种关系,在定义和实现一个类的时候,可以在一个已经存在的类的基础上来进行,把这个已经存在的类所定义的内容作为自己的内容,并加入若干新的内容。
一个父类可以有多个子类,这些子类都是父类的特例,父类描述了这些子类的公共属性和操作。一个子类可以继承它的父类中的属性和操作,这些属性和操作在子类中不必定义。子类中还可以定义自己的属性和操作。
5、多态
不同的对象收到同一消息可以产生完全不同的结果,这一现象叫作多态。在使用多态的时候,用户可以发送一个通用的消息,而实现的细节则由接收对象自行决定,这样,把具有通用功能的消息存放在高层次,而把不同的实现这一功能的行为放在较低层次,在这些低层次上生成的对象能够给通用消息以不同的响应。
在面向对象方法中多态指的是___
A.客户类无需知道所调用方法的特定子类的实现
B.对象动态地修改类
C.一个对象对应多张数据库表
D.子类只能够覆盖父类中非抽象的方法A
二、设计原则
单一职责原则:设计目的单一的类。
开放一封闭原则:对扩展开放,对修改封闭。
李氏(Liskov)替换原则:子类可以替换父类。
依赖倒置原则:要依赖于抽象,而不是具体实现:针对接口编程,不要针对实现编程。
**接口隔离原则:**使用多个专门的接口比使用单一的总接口要好。
**组合重用原则:**要尽量使用组合,而不是继承关系达到重用的目的。
迪米特(Demeter)原则:一个对象应当对其他对象有尽可能少的了解。
三、设计模式的概念与分类
设计模式:主要关注软件系统的设计,与具体的实现语言无关
设计模式一般有以下4个要素:
(1)模式名称。用一两个词来描述模式的问题、解决方案和效果。设计模式允许在较高的抽象层次上进行设计。
(2)问题。描述了应该在何时使用模式。它解释了设计问题和问题存在的前因后果,可能描述了特定的设计问题,如怎样用对象表示算法等;也可能描述了导致不灵活设计的类或对象结构。
(3) 解决方案。描述了设计的组成成分、它们之间的相互关系及各自的职责和协作方式。模式就像一个模板,提供设计问题的抽象描述和怎样用一个具有一般意义的元素组合(类或对象组合)来解决这个问题
(4)效果。描述了模式应用的效果及使用模式应权衡的问题。
四、创建型模式
创建型模式抽象了实例化过程。它们帮助一个系统独立于如何创建、组合和表示它的那些对象。一个类创建型模式使用继承改变被实例化的类,而一个对象创建型模式将实例化委托给另一个对象。
创建型模式中有两个不断出现的主旋律。第一,它们都将关于该系统使用哪些具体的类的信息封装起来。第二,它们隐藏了这些类的实例是如何被创建和放在一起的整个系统关于这些对象所知道的是由抽象类所定义的接口。
因此,创建型模式在为什么被创建,谁创建它,它是怎样被创建的,以及何时创建这些方面给予了很大的灵活性。它们允许用结构和功能差别很大的"产品对象配置-一个系统。配置可以是静态的(即在编译时指定),也可以是动态的(在运行时指定)。
设计模式名称 | 简要说明 |
---|---|
Abstract Factory(抽象工厂模式) | 提供一个接口,可以创建一系列相关或相互依赖的对象,而无需指定它们具体的类 |
Builder(构建器模式) | 将一个复杂类的表示与其构造相分离,使得相同的构建过程能够得出不同的表示 |
Factory Method(工厂方法模式) | 定义一个创建对象的接口,但由子类决定需要实例化哪一个类。工厂方法使得子类实例化的过程推迟。 |
Prototype(原型模式) | 用原型实例指定创建对象的类型,并且通过拷贝这个原型来创建新的对象 |
Singleton(单例模式) | 保证一个类只有一个实例,并提供一个访问它的全局访问点 |
五、结构性模式
结构性模式涉及如何组合类和对象以获得更大的结构。结构性模式采用继承机制来组合接口或实现。
结构性对象模式不是对接口和实现进行组合,而是描述了如何对一些对象进行组合,从而实现新功能的一些方法。
设计模式名称 | 简要说明 | 速记关键字 |
---|---|---|
Adapter(适配器模式) | 将一个类的接口转换成用户希望得到的另一个接口。它使原本不相容的接口得以协同工作 | 转换接口 |
Bridge(桥接模式) | 将类的抽象部分和它的实现部分分类开来,使它们可以独立地变化 | 继承树拆分 |
Composite(组合模式) | 将对象组合成树型结构以表示“整体—部分”的层次结构,使得用户对单个对象和组合对象的使用具有一致性 | 树形目录结构 |
Decorator(装饰模式) | 动态地给一个对象添加一些额外的职责。它提供了用子类扩展功能的一个灵活性的替代,比派生一个子类更加灵活 | 附件职责 |
Facade(外观模式) | 定义一个高层接口,为子系统中的一组接口提供一个一致的外观,从而简化了盖子系统的使用 | 对外同意接口 |
Flyweight(享元模式) | 提供支持大量细粒度对象共享的有效方法 | |
Proxy(代理模式) | 为其他对象提供一种代理以控制这个对象的访问 |
六、行为型模式
行为模式涉及算法和对象间职责的分配。行为模式不仅描述对象或类的模式,还描述它们之间的通信模式。这些模式刻画了在运行时难以跟踪的复杂的控制流。它们将用户的注意力从控制流转移到对象间的联系方式上来。
行为类模式使用继承机制在类间分派行为,主要有Template Method(模板方法)和lnterpreter(解释器)两种模式。
行为对象模式使用对象复合而不是继承。一些行为对象模式描述了一组对等的对象怎样相互协作以完成其中任一个对象都无法单独完成的任务。其他的行为对象模式常将行为封装在一个对象中并将请求指派给它。
设计模式名称 | 简要说明 | 速记关键字 |
---|---|---|
Chain of Resposibility(职责链模式) | 通过给多个对象处理请求的机会,减少请求的发送者与接收者之间的耦合。将接收对象链接起来,在链中传递请求,直到有一个对象处理这个请求 | 传递职责 |
Command(命令模式) | 将一个请求封装为一个对象,从而可用不同的请求对客户进行参数化,将请求排队或记录请求日志,支持可撤销的操作 | 日志记录,可撤销 |
Interpreter(解释器模式) | 给定一种语言,定义它的文法表示,并定义一个解释器,该解释器用来根据文法表示来解释语言中的句子 | |
Iterator(迭代器模式) | 提供一种方法来顺序访问一个聚合对象中的各个元素,而不需要暴露该对象的内部表示 | |
Mediator(中介者模式) | 用一个中介对象来封装一系列的对象交互。它使各对象不需要显示地相互调用,从而达到低耦合,还可以独立地改变对象间的交互 | 不直接引用 |
Memento(备忘录模式) | 在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态,从而可以在以后将该对象恢复到原先保存的状态 | |
Observer(观察者模式) | 定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变,所有的依赖于它的对象都得到通知并自动更新 | |
State(状态模式) | 允许一个对象在其内部状态改变时改变它的行为 | 状态变成类 |
Strategy(策略模式) | 定义一系列算法,把它们一个个封装起来,并且使它们之间可相互替换,从而让算法可以独立于使用它的用户而变换 | 多方案切换 |
Template Method(模板方法模式) | 定义一个操作中的算法骨架,而将一些步骤延迟到子类中,使得子类可以不改变一个算法的结构即可重新定义算法的某些特定步骤 | |
Visitor(访问者模式) | 表示一个作用于某对象结构中的各元素的操作,使得在不改变各元素的类的前提下定义作用于这些元素的新操作 |
七、Java程序设计
1、优点:
- 跨平台。
- 代码可移动(与html相结合)。
- 完全面向对象。
- 编出来的程序不易出错(没有指针,内存垃圾自动回收,不会产生内存泄露)。此外,还有简单、安全、多线程等优点。
2、Java与C++的区别:
- 全面向对象:无全局变量、无结构和联合、自动回收内存垃圾。
- 没有指针。
- 没有多继承
- 解释执行
7.1 基本语法
1、注释:多行用"./“,单行用“//”。
2、基本数据类型:char(8 bit)、short(16 bit)、int(32 bit)、long(64 bit)-float(32 bit)、 double (64 bit).
3、常量:使用final 关键字,如final float pi = 3.14f. final bytec= 12。浮点常数后面要加“f",如12.7f、1.02f。
4、运算符:算术运算符、赋值运算符、逻辑运算符、比较运算符、自增自减运算符、位运算符和移位运算符。
5、类型转换:如 int s=(int)4.7f.
6、基本语句:if、switch、while、do…while、for。输出函数: System out.println, 如System.out. println(“Id=” + nNum)。
7.2 类
一个类是一些属性和方法的封装体,类的定义用关键字class 声明,用关键字public、protected、private指定类的成员的存取控制属性:
- **private(私有)**成员面8只有类内部的方法才能访问;
- **protected(保护)**成员可被派生类和同一:文件夹下的类访问;
- public(公有)成员可以从类的外部访问。
默认是public。这体现了面向对象的以下指导思想:尽量将类内部的细节隐藏起来,对类的属性的操作应该通过类的方法来进行。
7.3 继承
Java中用关键字extends表示类间的继承关系。
父类的公有属性和方法成为子类的属性和方法,子类如果有和父类同名、同参数类型的方法,那么子类对象在调用该方法时,调用的是子类的方法亦即方法的重置。如果想要调用父类的同名方法,需要用super关键字(属性同理)。
子类的对象可以作为祖先类的对象使用,即所谓类的向上转换,反之则不行。具体表现在:可以用子类对象来对祖先类对象赋值,可以用子类对象作为实参去调用以父类对象为形参的函数。
重载
同一个类中的两个或两个以上方法,名字相同,而参数个数不同或参数类型不同,叫作重载。注意:方法名字和参数都一样,而仅仅返回值类型不同,这不是重载。
静态属性和静态方法
静态属性和静态方法的声明用关键字static实现。。一个类的静态属性只有一个,由所有该类的对象共享。不需要创建对象也能访问类的静态属性和方法,访问方式为“类名.静态属性或静态方法”。静态方法与对象无关,因此不能在静态方法中访问非静态属性和调用非静态方法。
7.4 this,super final
this代表当前对象,super代表当前对象的父类.
this 的主要用途:
- 一个构造函数调用另一个构造函数,对构造函数的调用必须是第一条语句。
- 将对象自身作为参数来调用一个函数。
super的用途:子类中调用父类的同名方法,或在子类的构造函数中调用父类的构造函数,此时也必须是第一条语句。
用final关键字定义的常量,在其初始化或第一次赋值后,其值不能被改变。常量必须先有值,然后才能使用。对于常量的第一次赋值只能在构造函数中进行。
final对象的值不能被改变,指的是该对象不能再指向其他对象,而不是指不能改变当前对象内部的属性值。
函数参数声明为final后,函数中的值不能改变。
final方法是不能被重置的方法
final类不能被继承,其所有方法都是final的,但属性可以不是final 的。
7.5 抽象类和接口
1、抽象类
抽象类通过关键字abstract实现,抽象类的目的是定义一个框架,规定某些类必须具有的一些共性。包含抽象方法的类一定是抽象类,所谓抽象方法是指没有函数体的方法。抽象类的直接派生类必须实现其抽象方法,抽象类只能用于继承,不能创建对象,
2、接口
接口用关键字interface 声明,只能用于继承。注意:此时关键字为implements(实现)。接口用于替代多继承的概念,能实现多继承的部分特点,又避免了多继承的混乱,还能起到规定程序框架的作用。注意:接口也可以用于多态。直接继承了接口的类,必须实现接口中的抽象方法间接的则可以实现,也可以不实现。
3、抽象类与接口的异同
接口和抽象类不能创建对象
抽象类 **不鞥参与多继承,**象类可以有非静态的成员变量,可以有非抽象方法。
接口可**以参与多继承,**所有属性都是静态常量,所有方法都是public抽象方法
UML的话还是建议看完基础知识后多刷真题!!!