auto commit

This commit is contained in:
CyC2018 2018-03-14 10:17:20 +08:00
parent e4f70d4f8f
commit 468d774c28

View File

@ -12,13 +12,21 @@
* [2.3 共同封闭原则](#23-共同封闭原则) * [2.3 共同封闭原则](#23-共同封闭原则)
* [2.4 稳定抽象原则](#24-稳定抽象原则) * [2.4 稳定抽象原则](#24-稳定抽象原则)
* [2.5 稳定依赖原则](#25-稳定依赖原则) * [2.5 稳定依赖原则](#25-稳定依赖原则)
* [面向对象的三大特性](#面向对象的三大特性) * [三大特性](#三大特性)
* [1. 封装](#1-封装) * [1. 封装](#1-封装)
* [2. 继承](#2-继承) * [2. 继承](#2-继承)
* [3. 多态](#3-多态) * [3. 多态](#3-多态)
* [UML](#uml) * [UML](#uml)
* [1. 类图](#1-类图) * [1. 类图](#1-类图)
* [1.1 继承相关](#11-继承相关)
* [1.2 整体和部分](#12-整体和部分)
* [1.3 相互联系](#13-相互联系)
* [2. 时序图](#2-时序图) * [2. 时序图](#2-时序图)
* [2.1 定义](#21-定义)
* [2.2 赤壁之战时序图](#22-赤壁之战时序图)
* [2.3 活动图、时序图之间的关系](#23-活动图时序图之间的关系)
* [2.4 类图与时序图的关系](#24-类图与时序图的关系)
* [2.5 时序图的组成](#25-时序图的组成)
* [参考资料](#参考资料) * [参考资料](#参考资料)
<!-- GFM-TOC --> <!-- GFM-TOC -->
@ -55,7 +63,7 @@
### 1.3 里氏替换原则 ### 1.3 里氏替换原则
**子类实例应该能够替换掉所有父类实例。** **子类对象必须能够替换掉所有父类对象。**
继承是一种 IS-A 关系,子类需要能够当成父类来使用,并且需要比父类更特殊。 继承是一种 IS-A 关系,子类需要能够当成父类来使用,并且需要比父类更特殊。
@ -112,22 +120,21 @@
包之间的依赖关系都应该是稳定方向依赖的,包要依赖的包要比自己更具有稳定性。 包之间的依赖关系都应该是稳定方向依赖的,包要依赖的包要比自己更具有稳定性。
# 面向对象的三大特性 # 三大特性
## 1. 封装 ## 1. 封装
利用抽象数据类型将数据和基于数据的操作封装在一起,使其构成一个不可分割的独立实体数据被保护在抽象数据类型的内部,尽可能地隐藏内部的细节,只保留一些对外接口使之与外部发生联系。用户无需知道对象内部的细节,但可以通过对象对外提供的接口来访问该对象。 利用抽象数据类型将数据和基于数据的操作封装在一起,使其构成一个不可分割的独立实体数据被保护在抽象数据类型的内部,尽可能地隐藏内部的细节,只保留一些对外接口使之与外部发生联系。用户无需知道对象内部的细节,但可以通过对象对外提供的接口来访问该对象。
封装有三大好处: 封装有三大好处:
1. 良好的封装能够减少耦合。 1. 减少耦合
2. 类内部的结构可以自由修改。 2. 隐藏内部细节,因此内部结构可以自由修改
3. 可以对成员进行更精确的控制。 3. 可以对成员进行更精确的控制
4. 隐藏信息,实现细节。
以下 Person 类封装 name、gender、age 等属性,外界只能通过 get() 方法获取一个 Person 对象的 name 属性和 gender 属性,而无法获取 age 属性,但是 age 属性可以供 work() 方法使用。 以下 Person 类封装 name、gender、age 等属性,外界只能通过 get() 方法获取一个 Person 对象的 name 属性和 gender 属性,而无法获取 age 属性,但是 age 属性可以供 work() 方法使用。
注意到 gender 属性使用 int 数据类型进行存储,封装使得用户注意不到这种实现细节。并且在需要修改使用的数据类型时,也可以在不影响客户端代码的情况下进行。 注意到 gender 属性使用 int 数据类型进行存储,封装使得用户注意不到这种实现细节。并且在需要修改 gender 属性使用的数据类型时,也可以在不影响客户端代码的情况下进行。
```java ```java
public class Person { public class Person {
@ -147,7 +154,7 @@ public class Person {
if(18 <= age && age <= 50) { if(18 <= age && age <= 50) {
System.out.println(name + " is working very hard!"); System.out.println(name + " is working very hard!");
} else { } else {
System.out.println(name + " can't work!"); System.out.println(name + " can't work any more!");
} }
} }
} }
@ -155,23 +162,27 @@ public class Person {
## 2. 继承 ## 2. 继承
继承实现了 **is-a** 关系,例如 Cat 和 Animal 就是一种 is-a 关系,因此可以将 Cat 继承自 Animal从而获得 Animal 非 private 的属性和方法。 继承实现了 **IS-A** 关系,例如 Cat 和 Animal 就是一种 IS-A 关系,因此 Cat 可以继承自 Animal从而获得 Animal 非 private 的属性和方法。
Cat 可以当做 Animal 来使用,也就是可以使用 Animal 引用 Cat 对象,这种子类转换为父类称为 **向上转型** Cat 可以当做 Animal 来使用,也就是说可以使用 Animal 引用 Cat 对象。父类引用指向子类对象称为 **向上转型**
继承应该遵循里氏替换原则:当一个子类的实例应该能够替换任何其超类的实例时,它们之间才具有 is-a 关系。
```java ```java
Animal animal = new Cat(); Animal animal = new Cat();
``` ```
继承应该遵循里氏替换原则,子类对象必须能够替换掉所有父类对象。
## 3. 多态 ## 3. 多态
多态分为编译时多态和运行时多态。编译时多态主要指方法的重,运行时多态指程序中定义的对象引用所指向的具体类型在运行期间才确定。 多态分为编译时多态和运行时多态。编译时多态主要指方法的重,运行时多态指程序中定义的对象引用所指向的具体类型在运行期间才确定。
多态有三个条件:1. 继承2. 覆盖父类方法3. 向上转型。 运行时多态有三个条件:
下面的代码中乐器类Instrument有两个子类Wind 和 Percussion它们都覆盖了 play() 方法,并且在 main() 方法中使用父类 Instrument 来引用 Wind 和 Percussion 对象。在 Instrument 引用调用 play() 方法时,会执行实际引用对象所在类的 play() 方法,而不是 Instrument 类的方法。 1. 继承
2. 覆盖
3. 向上转型
下面的代码中乐器类Instrument有两个子类Wind 和 Percussion它们都覆盖了父类的 play() 方法,并且在 main() 方法中使用父类 Instrument 来引用 Wind 和 Percussion 对象。在 Instrument 引用调用 play() 方法时,会执行实际引用对象所在类的 play() 方法,而不是 Instrument 类的方法。
```java ```java
public class Instrument { public class Instrument {
@ -202,54 +213,51 @@ public class Music {
} }
} }
} }
``` ```
# UML # UML
## 1. 类图 ## 1. 类图
**1.1 继承相关** ### 1.1 继承相关
继承有两种形式 : 泛化(generalize和实现realize表现为 is-a 关系。 继承有两种形式 : 泛化(Generalize和实现Realize表现为 IS-A 关系。
① 泛化关系 (generalization) **泛化关系 (Generalize)**
从具体类中继承 从具体类中继承
<div align="center"> <img src="../pics//29badd92-109f-4f29-abb9-9857f5973928.png"/> </div><br> <div align="center"> <img src="../pics//29badd92-109f-4f29-abb9-9857f5973928.png"/> </div><br>
② 实现关系 (realize) **实现关系 (Realize)**
从抽象类或者接口中继承 从抽象类或者接口中继承
<div align="center"> <img src="../pics//4b16e1d3-3a60-472c-9756-2f31b1c48abe.png"/> </div><br> <div align="center"> <img src="../pics//4b16e1d3-3a60-472c-9756-2f31b1c48abe.png"/> </div><br>
**1.2 整体和部分** ### 1.2 整体和部分
① 聚合关系 (aggregation) **聚合关系 (Aggregation)**
表示整体由部分组成,但是整体和部分不是强依赖的,整体不存在了部分还是会存在。以下表示 B 由 A 组成: 表示整体由部分组成,但是整体和部分不是强依赖的,整体不存在了部分还是会存在。以下表示 B 由 A 组成:
<div align="center"> <img src="../pics//34259bb8-ca3a-4872-8771-9e946782d9c3.png"/> </div><br> <div align="center"> <img src="../pics//34259bb8-ca3a-4872-8771-9e946782d9c3.png"/> </div><br>
② 组合关系 (composition) **组合关系 (Composition)**
和聚合不同,组合中整体和部分是强依赖的,整体不存在了部分也不存在了。比如公司和部门,公司没了部门就不存在了。但是公司和员工就属于聚合关系了,因为公司没了员工还在。 和聚合不同,组合中整体和部分是强依赖的,整体不存在了部分也不存在了。比如公司和部门,公司没了部门就不存在了。但是公司和员工就属于聚合关系了,因为公司没了员工还在。
<div align="center"> <img src="../pics//7dda050d-ac35-4f47-9f51-18f18ed6fa9a.png"/> </div><br> <div align="center"> <img src="../pics//7dda050d-ac35-4f47-9f51-18f18ed6fa9a.png"/> </div><br>
**1.3 相互联系** ### 1.3 相互联系
① 关联关系 (association) **关联关系 (Association)**
表示不同类对象之间有关联,这是一种静态关系,与运行过程的状态无关,在最开始就可以确定。因此也可以用 1 对 1、多对 1、多对多这种关联关系来表示。比如学生和学校就是一种关联关系一个学校可以有很多学生但是一个学生只属于一个学校因此这是一种多对一的关系在运行开始之前就可以确定。 表示不同类对象之间有关联,这是一种静态关系,与运行过程的状态无关,在最开始就可以确定。因此也可以用 1 对 1、多对 1、多对多这种关联关系来表示。比如学生和学校就是一种关联关系一个学校可以有很多学生但是一个学生只属于一个学校因此这是一种多对一的关系在运行开始之前就可以确定。
<div align="center"> <img src="../pics//4ccd294c-d6b2-421b-839e-d88336ff5fb7.png"/> </div><br> <div align="center"> <img src="../pics//4ccd294c-d6b2-421b-839e-d88336ff5fb7.png"/> </div><br>
② 依赖关系 (dependency) **依赖关系 (Dependency)**
和关联关系不同的是 , 依赖关系是在运行过程中起作用的。一般依赖作为类的构造器或者方法的参数传入。双向依赖时一种不好的设计。 和关联关系不同的是 , 依赖关系是在运行过程中起作用的。一般依赖作为类的构造器或者方法的参数传入。双向依赖时一种不好的设计。
@ -257,13 +265,11 @@ public class Music {
## 2. 时序图 ## 2. 时序图
http://www.cnblogs.com/wolf-sun/p/UML-Sequence-diagram.html ### 2.1 定义
**2.1 定义**
时序图描述了对象之间传递消息的时间顺序,它用来表示用例的行为顺序。它的主要作用是通过对象间的交互来描述用例(注意是对象),从而寻找类的操作。 时序图描述了对象之间传递消息的时间顺序,它用来表示用例的行为顺序。它的主要作用是通过对象间的交互来描述用例(注意是对象),从而寻找类的操作。
**2.2 赤壁之战时序图** ### 2.2 赤壁之战时序图
从虚线从上往下表示时间的推进。 从虚线从上往下表示时间的推进。
@ -295,19 +301,19 @@ public class 孙权 {
} }
``` ```
**2.3 活动图、时序图之间的关系** ### 2.3 活动图、时序图之间的关系
活动图示从用户的角度来描述用例; 活动图示从用户的角度来描述用例;
时序图是从计算机的角度(对象间的交互)描述用例。 时序图是从计算机的角度(对象间的交互)描述用例。
**2.4 类图与时序图的关系** ### 2.4 类图与时序图的关系
类图描述系统的静态结构,时序图描述系统的动态行为。 类图描述系统的静态结构,时序图描述系统的动态行为。
**2.5 时序图的组成** ### 2.5 时序图的组成
① 对象 **对象**
有三种表现形式 有三种表现形式
@ -319,13 +325,13 @@ public class 孙权 {
2. 把初始化整个交互活动的对象(有时是一个参与者)放置在最左边。 2. 把初始化整个交互活动的对象(有时是一个参与者)放置在最左边。
② 生命线 **生命线**
生命线从对象的创建开始到对象销毁时终止 生命线从对象的创建开始到对象销毁时终止
<div align="center"> <img src="../pics//b7b0eac6-e7ea-4fb6-8bfb-95fec6f235e2.png"/> </div><br> <div align="center"> <img src="../pics//b7b0eac6-e7ea-4fb6-8bfb-95fec6f235e2.png"/> </div><br>
③ 消息 **消息**
对象之间的交互式通过发送消息来实现的。 对象之间的交互式通过发送消息来实现的。
@ -345,17 +351,17 @@ public class 孙权 {
4\. 返回消息,可选。 4\. 返回消息,可选。
④ 激活 **激活**
生命线上的方框表示激活状态,其它时间处于休眠状态。 生命线上的方框表示激活状态,其它时间处于休眠状态。
<div align="center"> <img src="../pics//6ab5de9b-1c1e-4118-b2c3-fb6c7ed7de6f.png"/> </div><br> <div align="center"> <img src="../pics//6ab5de9b-1c1e-4118-b2c3-fb6c7ed7de6f.png"/> </div><br>
# 参考资料 # 参考资料
- Java 编程思想 - Java 编程思想
- [ 面向对象设计的 SOLID 原则 ](http://www.cnblogs.com/shanyou/archive/2009/09/21/1570716.html) - 敏捷软件开发:原则、模式与实践
- [ 看懂 UML 类图和时序图 ](http://design-patterns.readthedocs.io/zh_CN/latest/read_uml.html#generalization) - [面向对象设计的 SOLID 原则](http://www.cnblogs.com/shanyou/archive/2009/09/21/1570716.html)
- [看懂 UML 类图和时序图](http://design-patterns.readthedocs.io/zh_CN/latest/read_uml.html#generalization)
- [UML 系列——时序图顺序图sequence diagram](http://www.cnblogs.com/wolf-sun/p/UML-Sequence-diagram.html) - [UML 系列——时序图顺序图sequence diagram](http://www.cnblogs.com/wolf-sun/p/UML-Sequence-diagram.html)
- [ 面向对象编程三大特性 ------ 封装、继承、多态 ](http://blog.csdn.net/jianyuerensheng/article/details/51602015) - [面向对象编程三大特性 ------ 封装、继承、多态](http://blog.csdn.net/jianyuerensheng/article/details/51602015)