
1.设计模式简介
关于历史背景,这里就省略不再赘述,感兴趣可以自行搜索哟~
这里主要先简单理解几个概念:
模式是什么?
模式是在特定环境 下人们解决某类重复出现问题的一套成功或有效的解决方案。(这里还没有应用到软件上,指的是现实生活)
软件模式是什么?
软件模式是将模式的一般概念应用于软件开发领域 ,即软件开发的总体指导思路 或参照样板。
软件模式可以被认为是对软件开发这一特定"问题"的"解法"的某种统一表示,即软件模式是在一定条件下软件开发问题及其解法。
软件模式并非仅限于设计模式 ,还包括架构模式、分析模式和过程模式等,实际上,在软件开发生命周期的每一个阶段都存在着一些被认同的模式。
设计模式是什么?
设计模式用于在特定的条件 下为一些重复出现的软件设计问题提供合理的、有效的解决方案
设计模式包括哪些基本要素?
设计模式一般包含模式名称、问题、目的、解决方案、效果等组成要素,其中关键要素是模式名称、问题、解决方案和效果。
-
模式名称:指的是通过一两个词来描述模式的问题、解决方案和效果。绝大多数模式都是根据其功能或模式结构来命名的。以便更好地理解模式并方便开发人员之间的交流。
-
问题:描述了应该在何时使用模式,它包含了设计中存在的问题以及问题存在的原因。
-
解决方案 :描述了一个设计模式的组成成分,以及这些组成成分之间的相互关系,各自的职责和协作方式,通常解决方案通过
UML类图和核心代码来进行描述。对于每一个设计模式用户必须掌握其类图,理解类图中每个角色的意义以及他们之间的关系,同时需要掌握核心代码。 -
效果 :描述了模式的优缺点以及在使用模式时应权衡的问题。在评价效果的时候一般需要结合面向对象的设计原则来评估。
面向对象的设计原则,后续会提到
设计模式的分类有哪些?
设计模式一般有两种分类方式。
根据用途分类
可分为创建型(Creational) ,结构型(Structural) 和行为型(Behavioral) 三种。
- 创建型模式:主要用于描述如何创建对象
- 结构型模式:主要用于描述如何实现类或对象的组合
- 行为型模式:主要用于描述类或对象怎样交互以及怎样分配职责
根据范围分类
设计模式根据范围(模式主要是用于处理类之间的关系还是对象之间的关系)还可以分为类模式和对象模式。
- 类模式:处理类和子类之间的关系,这类关系通过继承实现,在编译时就确定下来的一种静态关系。
- 对象模式:处理对象之间的关系,这些关系在运行时变化,更具动态性。
- tip:如果这样划分,类模式之外所有的都是对象模式
我们经常将两种分类方式结合使用,如单例模式是对象创建型模式,模板方法模式是类行为型模式。

注意:有一个设计模式虽然不属于GoF23种设计模式,但一般在介绍设计模式时都会对它进行说明,它就是简单工厂模式 ,也许是太"简单"了,GoF并没有把它写到那本经典著作中。
GoF是什么?可以参考下面的连接(可以简单理解成 23 种设计模式的创始人 们):
设计模式的优点有哪些?
- 是可维护性复用的设计方案,有助于我们提高开发和设计效率,但它不保证一定会提高。
- 设计模式提供了一套通用的设计词汇和一种通用的形式来方便开发人员之间沟通和交流
- 许多设计模式有助于提高系统的灵活性和可扩展性**
- 合理使用设计模式并对设计模式的使用情况进行文档化,将有助于别人更快地理解系统
- ,学习设计模式将有助于初学者更加深入地理解面向对象思想
2.UML图
2.1概念
统一建模语言(英语:Unified Modeling Language,缩写UML) 是非专利的第三代建模和规约语言。
参考链接:维基百科
在UML系统开发中有三个主要的模型:
- 功能模型 :从用户的角度展示系统的功能,包括用例图。
- 对象模型 :采用对象,属性,操作,关联等概念展示系统的结构和基础,包括类别图、对象图。
- 动态模型 :展现系统的内部行为。包括序列图,活动图,状态图。
我们可以这样理解这三者的协作:
- 功能模型 :决定系统该做什么(需求)。
- 对象模型(类图) :决定系统长什么样(静态结构)。
- 动态模型 :决定系统怎么运行(逻辑行为)。
制图软件
- StarUML -> 自行百度下载即可
关于ULM图,更详细的可以参考上面的连接,这里我们讲解常用的类图
2.2类图
类图是一切面向对象方法的核心建模工具。该图描述了系统中对象的类型以及它们之间存在的各种静态关系。
下面是用StarUML 画的一个类图,包含了类的属性以及方法等内容:

对应java代码:
java
public class Person {
// #id: Integer -> 受保护的 Integer 类型
protected Integer id;
// +name: String -> 公有的 String 类型
public String name;
// -age: int -> 私有的基本数据类型 int
private int age;
// ~mail: String -> 包访问权限 (Default) 的 String 类型
String mail;
/**
* +speak(words: String): void
* 公有的 speak 方法,接收 String 参数,无返回值
*/
public void speak(String words) {
// 方法实现逻辑
}
}
在UML中类图一般由3部分组成。
- 第一部分:类名,按照命名规范来定义。
- 第二部分:属性(Attribute),属性通常值类的成员变量。
定义格式:
uml
[可见性] 属性名:数据类型 [=默认值]
- 第三部分: 操作(Operation),操作通常指类的成员方法。
定义格式:
uml
[可见性] 方法名([参数1:数据类型,参数2:数据类型,....]) [:返回值类型]
2.3类之间的关系
1 关联关系
关联(Association) 关系是一种结构化的关系,用于表示一个类对象与另一个类对象的之间的关系,在代码中被关联的对象以成员变量的方式体现。
1.1单向关联
下面是一个单向关联的UML表示方式:

java
public class Address {
......
}
java
public class Person {
protected Integer id;
public String name;
private int age;
String mail;
protected Address address;
public void speak(String words) {
......
}
}
1.2双向关联

java
public class Gift {
public Person person;
}
java
public class Person {
protected Integer id;
public String name;
private int age;
String mail;
protected Address address;
public Gift gift;
public void speak(String words) {
}
}
1.3自关联

java
public class Node {
public Node subNode;
}
1.4多重性关联
多重性关联关系又称为重数性(Multiplicity)关联关系,表示关联对象之间存在数量关系。
数量关系符表示如下
1或1..1:表示另一个类的一个对象只与该类的一个对象有关系0..*:表示另一个类的一个对象与该类的零个或多个对象有关系1..*:表示另一个类的一个对象与该类的一个或多个对象有关系0..1:表示另一个类的一个对象没有或只与该类的一个对象有关系m..n:表示另一个类的一个对象与该类最少m最多n个对象有关系(m ≤ n)

一个小组可以有1到多个成员,但是每个成员只属于一个组
java
public class Element {
}
java
public class Group {
private Element[] elements;
}
2 聚合关系
聚合(Aggregation)关系 表示整体与部分的关系,在聚合中成员是整体对象的一部分,成员对象可以脱了整体对象而独立存在。

java
public class Car {}
public class House {}
public class Deposit {}
public class Human {
public Car[] cars;
public House[] houses;
public Deposit[] deposits;
}
3 组合关系
组合(Composition)关系 也表示整体与部分的关系,在组合中整体对象可以控制成员对象的生命周期,一旦整体对象消亡成员对象将消失。

java
public class Head {}
public class Extremities {}
public class Body {}
public class Human {
public Head head;
public Extremities extremities;
public Body body;
}
4.依赖关系
依赖(Dependency)关系 是一种使用关系,在大多数情况下依赖关系体现在某个类方法参数上使用另一个类的对象作为方法参数。

java
public class Box {}
public class Human {
public void moveBox(Box box) {
}
}
5 泛化关系
泛化(Generalization)关系 也就是继承关系。

java
public class Human {}
public class Student extends Human {}
public class Teacher extends Human {}
6 接口与实现关系
接口(Interface) 之间也可以有与类之间关系类似的继承关系和依赖关系,接口与类之间同时还存在一种实现(Realization)关系,在这种关系中类实现了接口中所有的操作。

java
public interface Vehicle {
}
public class Ship implements Vehicle {
}
public class Car implements Vehicle {
}
总结六大关系
| 关系类型 | UML 图示 |
|---|---|
| 泛化 (Generalization) | 实线 + 空心三角形 |
| 实现 (Realization) | 虚线 + 空心三角形 |
| 组合 (Composition) | 实线 + 实心菱形 |
| 聚合 (Aggregation) | 实线 + 空心菱形 |
| 关联 (Association) | 实线 + 普通箭头 (或无箭头) |
| 依赖 (Dependency) | 虚线 + 普通箭头 |