1.设计模式是什么
设计模式是一套被反复使用的、多数人知晓的、经过分类编目的代码设计经验的总结,使用设计模式是为了可以重用代码,让代码可以更容易被他人理解并且提高代码的可靠性。
2.UML
2.1 UML特性
- UML融合了多种优秀的面向对象建模方法以及多种得到认可的软件工程方法;
- UML是一种可视化建模语言,它通过一些便准的图形符号和文字对系统进行建模,用于对软件进行描述、可视化处理、构造和建立软件系统制品的文档。
- UML是一种语言,它有属于自己的标准表达规则。
2.2 UML结构
- 视图(View)
从不同角度来表示建模系统:用户视图、结构视图、行为视图、实现视图和环境视图。 - 图(Diagram)
UML图是描述UML视图内容的图形,包括13种图:用例图、类图、对象图、包图、组合结构图、状态图、活动图、顺序图、通信图、定时图、交互概览图、组件图和部署图。 - 模型元素
UML图中使用的一些概念,对应于普通的面向对象概念,如类、对象、消息及这些概念之间的关系(关联关系、依赖关系、泛化关系等)。 - 通用机制
提供额外的注释、信息、语义和扩展机制。
3.类与类的UML图示
3.1 类
- 类封装了数据和行为,是面向对象的重要组成部分,他是具有相同的属性、操作、关系的对象集合的总称。
- 在软件系统运行时,类将被实例化成对象(Object),对象对应于某个具体的事物,是类的实例。
- 类图是用出现在系统中的不同类来描述系统的静态结构,主要用来描述不同的类以及它们之间的关系。
3.2 类的UML图示
在UML类图中,类一般由三个部分组成:
-
类名
-
类的属性:类的成员变量
UML规定属性的表示方式为:可见性 名称 : 类型 [= 默认值]
(1)可见性表示该属性对于类外的元素而言是否可见,包括:公有(public)、私有(private)和受保护(protected)3种,在类图中分别用+、-和#表示。
(2)名称表示属性名
(3)类型表示属性的数据类型
(4)默认值是一个可选项,即属性的初始值。 -
类的操作:类的任何一个实例对象都可以使用的行为,是类的成员方法。
UML规定操作的表示方法为:可见性 名称([参数列表])[ : 返回类型]
(1)可见性与属性定义相同;
(2)名称即为方法名;
(3)参数列表表示方法的参数;
(4)返回 类型是一个可选项 ,表示方法的返回值类型。
4.类之间的关系
4.1 关联关系
-
双向关联
顾客购买商品并拥有商品,卖出的商品总有某个顾客与之关联。因此Customer类与Product类之间具有双向关联关系。
对应Java代码片段如下:public class Customer{ private Product[] products; ... } public class Product{ private Customer customer; ... }
-
单向关联
顾客拥有地址,则Customer类与Address类具有单向关联关系。
对应Java片段如下:public class Customer{ private Address adddress; ... } public class Address{ ... }
-
自关联
在系统中可能会出现存在一些类的属性对象类型为该类本身,如下图所示:
对应的Java片段如下:public class Node{ private Node subNode; ... }
-
多重性关联
又称重数性关联,表示两个关联对象在数量上的对应关系。表示方式 说明 1…1 另一个类的一个对象只与该类的一个对象有关系 0…* 另一个类的一个对象与该类的0个或多个对象有关系 1…* 另一个类的一个对象与该类的1个或多个对象有关系 0…1 另一个类的一个对象没有或只与该类的1个对象有关系 m…n 另一个类的一个对象与该类的最少m个,最多n个对象有关系 (m<=n) 例如一个界面可以拥有0个或多个按钮,但是一个按钮只能属于一个界面。
对应的Java片段如下:public class Form{ private Button[] buttons; ... } public class Button{ ... }
-
聚合关系
表示整体与部分的关系。在聚合关系中,成员对象是整体对象的一部分,但是成员对象可以脱离整体对象独立存在。例如汽车发动机是汽车的组成部分,但是汽车发动机可以独立存在。
对应的Java片段如下:public class Car{ private Engine engine; //构造注入 public Car(Engine engine){ the.engine = engine; } //设值注入 public setEngine(Engine engine){ the.engine = engine; } ... } public class Engine{ ... }
-
组合关系
表示类之间整体和部分的关系,但是在组合关系中整体对象可以控制成员对象的生命周期。一旦整体对象不存在,成员对象也将不存在。例如人的嘴巴是头的一部分,头没了,嘴巴也就没了,因此它们是组合关系。
对应的Java片段如下:
public class Head{
private Mouth mouth;
public Head(){
mouth = new Mouth(); //实例化成员对象
}
...
}
public class Mouth{
...
}
4.2 依赖关系
是一种使用关系,特定事物的改变可能会影响到使用该事物的其它事物,在需要表示一个事物使用另一个事物时使用依赖关系。例如驾驶员开车,在Driver类的drive()方法中将Car类型的对象car作为一个参数传递,以便在drive()方法中能够调用Car类的move()方法,且驾驶员的drive()方法依赖车的move()方法,因此Driver类依赖Car类。
在系统实施阶段,依赖关系通常使用3种方法实现。第1种将一个类的对象作为另一个类中方法的参数,即上例;第2种在一个类的方法中将另一个类的对象作为其局部变量;第3种方法在一个类的方法中调用另一个类的静态方法。
上例的Java片段对应如下:
public class Driver{
public void drive(Car car){
car.move();
}
...
}
public class Car{
public void move(){
...
}
...
}
4.3 泛化关系
即继承关系,用于描述父类与子类之间的关系,父类又称为基类或超类,子类又称为派生类。
对应的Java片段如下:
public class Person{
protected String name;
protected int age;
public void move(){
...
}
public void say(){
...
}
}
//子类
public class Student extends Person{
private String StudentNo;
public void study(){
...
}
}
//子类
public class Teacher extends Person{
private String teacherNo;
public void teach(){
...
}
}
4.4 接口与实现关系
接口之间也可以有与类之间关系类似的继承关系和依赖关系,但是接口和类之间还存在一种实现关系。
对应的Java片段如下:
public interface Vehicle{
public void move(){
}
}
public class Ship implements Vehicle{
public void move(){
}
}
public class Car implements Vehicle{
public void move(){
}
}