diff --git a/notes/pics/dp-strategy.png b/notes/pics/dp-strategy.png new file mode 100644 index 00000000..3a39f5ed Binary files /dev/null and b/notes/pics/dp-strategy.png differ diff --git a/notes/设计模式 - 策略.md b/notes/设计模式 - 策略.md index d36824ea..b5d6ddee 100644 --- a/notes/设计模式 - 策略.md +++ b/notes/设计模式 - 策略.md @@ -1,17 +1,17 @@ ## 9. 策略(Strategy) -### Intent - +### 意图 定义一系列算法,封装每个算法,并使它们可以互换。 策略模式可以让算法独立于使用它的客户端。 -### Class Diagram - +### 类图 - Strategy 接口定义了一个算法族,它们都实现了 behavior() 方法。 - Context 是使用到该算法族的类,其中的 doSomething() 方法会调用 behavior(),setStrategy(Strategy) 方法可以动态地改变 strategy 对象,也就是说能动态地改变 Context 所使用的算法。 -

+下图按后文的鸭子示例画出:Duck 是 Context,QuackBehavior 是 Strategy,quack()、performQuack() 和 setQuackBehavior() 分别对应 behavior()、doSomething() 和 setStrategy()。 + +

### 与状态模式的比较 @@ -19,8 +19,7 @@ 状态模式主要是用来解决状态转移的问题,当状态发生转移了,那么 Context 对象就会改变它的行为;而策略模式主要是用来封装一组可以互相替代的算法族,并且可以根据需要动态地去替换 Context 使用的算法。 -### Implementation - +### 实现 设计一个鸭子,它可以动态地改变叫声。这里的算法族是鸭子的叫声行为。 ```java @@ -77,13 +76,17 @@ public class Client { } ``` -```html +```text squeak! quack! ``` -### JDK - +### JDK 中的应用 - java.util.Comparator#compare() - javax.servlet.http.HttpServlet - javax.servlet.Filter#doFilter() + +## 参考资料 + +- 弗里曼. Head First 设计模式 [M]. 中国电力出版社, 2007. +- Gamma E. 设计模式: 可复用面向对象软件的基础 [M]. 机械工业出版社, 2007.