diff --git a/notes/设计模式.md b/notes/设计模式.md index d7a44bc4..ed927655 100644 --- a/notes/设计模式.md +++ b/notes/设计模式.md @@ -1,4 +1,5 @@ +* [前言](#前言) * [第一章 设计模式入门](#第一章-设计模式入门) * [第二章 观察者模式](#第二章-观察者模式) * [第三章 装饰模式](#第三章-装饰模式) @@ -25,6 +26,14 @@ +# 前言 + +文中涉及一些 UML 类图,为了更好地理解,可以先阅读 [UML 类图](https://github.com/CyC2018/Interview-Notebook/blob/master/notes/%E9%9D%A2%E5%90%91%E5%AF%B9%E8%B1%A1%E6%80%9D%E6%83%B3.md#1-%E7%B1%BB%E5%9B%BE)。 + +需要说明的一点是,文中的 UML 图和规范的 UML 不大相同,其中组合关系使用以下箭头表示: + +![](https://github.com/CyC2018/InterviewNotes/blob/master/pics//df48ea1b-3069-4fb7-93c0-4c8a26c7ed7c.png) + # 第一章 设计模式入门 **1. 设计模式概念** @@ -1431,30 +1440,41 @@ Composite:root 允许对象在内部状态改变时改变它的行为,对象看起来好像修改了它所属的类。 -状态模式的类图和策略模式一样,并且都是能够动态改变对象的行为。但是状态模式是通过状态对象的状态转移来改变客户对象组合的状态对象,而策略模式是通过客户对象本身的决策来改变组合的策略对象。例如,状态模式下,客户对象委托状态对象进行一个处理操作,那么状态对象有可能发生状态转移,使得客户对象拥有的状态对象发生改变。 - **2. 模式类图** +Context 的 request() 方法委托给 State 对象去处理。当 Context 组合的 State 对象发生改变时,它的行为也就发生了改变。 + ![](https://github.com/CyC2018/InterviewNotes/blob/master/pics//c28fd93a-0d55-4a19-810f-72652feee00d.jpg) -**3. 问题描述** +**3. 与策略模式的比较** + +状态模式的类图和策略模式一样,并且都是能够动态改变对象的行为。 + +但是状态模式是通过状态转移来改变 Context 所组合的 State 对象,而策略模式是通过 Context 本身的决策来改变组合的 Strategy 对象。 + +所谓的状态转移,是指 Context 在运行过程中由于一些条件发生改变而使得 State 对象发生改变,主要必须要是在运行过程中。 + +状态模式主要是用来解决状态转移的问题,当状态发生庄毅了,那么 Context 对象就会改变它的行为;而策略模式主要是用来封装一组可以互相替代的算法族,并且可以根据需要动态地去替换 Context 需要使用哪个算法。 + +**4. 问题描述** 糖果销售机有多种状态,每种状态下销售机有不同的行为,状态可以发生转移,使得销售机的行为也发生改变。 ![](https://github.com/CyC2018/InterviewNotes/blob/master/pics//f7d880c9-740a-4a16-ac6d-be502281b4b2.jpg) -**4. 直接解决方案** +**5. 直接解决方案** -在糖果机的每个操作函数里面,判断当前的状态,根据不同的状态进行不同的处理,并且发生不同的状态转移。这种解决方案把所有的实现细节都放到客户类,这样在新增状态的时候就要去修改客户类的代码。 +在糖果机的每个操作函数里面,判断当前的状态,根据不同的状态进行不同的处理,并且发生不同的状态转移。 + +这种解决方案在需要增加状态的时候,必须对每个操作的代码都进行修改。 ![](https://github.com/CyC2018/InterviewNotes/blob/master/pics//62ebbb63-8fd7-4488-a866-76a9dc911662.png) -**5. 使用状态模式的解决方案** +**6 代码实现** -状态的转移被移到状态类里面,客户类的每个操作只需要委托给状态类即可,而不需要知道当前是什么状态以及状态时如何进行转移的。 +糖果销售机即 Context。 - -**6. 代码实现** +下面的实现中每个 State 都组合了 Context 对象,这是因为状态转移的操作在 State 对象中,而状态转移过程又必须改变 Context 对象的 state 对象,因此 State 必须拥有 Context 对象。 ```java public interface State { diff --git a/notes/面向对象思想.md b/notes/面向对象思想.md index 16f5d9d8..27d1e76d 100644 --- a/notes/面向对象思想.md +++ b/notes/面向对象思想.md @@ -175,7 +175,6 @@ public class Music { ![](https://github.com/CyC2018/InterviewNotes/blob/master/pics//34259bb8-ca3a-4872-8771-9e946782d9c3.png) - ② 组合关系 (composition) 和聚合不同,组合中整体和部分是强依赖的,整体不存在了部分也不存在了。比如公司和部门,公司没了部门就不存在了。但是公司和员工就属于聚合关系了,因为公司没了员工还在。 @@ -196,7 +195,6 @@ public class Music { ![](https://github.com/CyC2018/InterviewNotes/blob/master/pics//47ca2614-509f-476e-98fc-50ec9f9d43c0.png) - ## 2. 时序图 **2.1 定义** diff --git a/pics/df48ea1b-3069-4fb7-93c0-4c8a26c7ed7c.png b/pics/df48ea1b-3069-4fb7-93c0-4c8a26c7ed7c.png new file mode 100644 index 00000000..4f0ffa3d Binary files /dev/null and b/pics/df48ea1b-3069-4fb7-93c0-4c8a26c7ed7c.png differ