diff --git a/notes/设计模式.md b/notes/设计模式.md index 2189eb31..f0137d3a 100644 --- a/notes/设计模式.md +++ b/notes/设计模式.md @@ -451,7 +451,7 @@ public class Client { ### JDK -- [java.lang.Object#clone()] (http://docs.oracle.com/javase/8/docs/api/java/lang/Object.html#clone%28%29) +- [java.lang.Object#clone()](http://docs.oracle.com/javase/8/docs/api/java/lang/Object.html#clone%28%29) # 三、行为型 @@ -621,7 +621,77 @@ public class Client { ### 意图 -定义一系列算法,封装每个算法,并使它们可以互换。策略可以让算法独立于使用它的客户端。 +定义一系列算法,封装每个算法,并使它们可以互换。 + +策略模式可以让算法独立于使用它的客户端。 + +### 类图 + +- Strategy 接口定义了一个算法族,它们都具有 BehaviorInterface() 方法。 +- Context 是使用到该算法族的类,其中的 doSomething() 方法会调用 BehaviorInterface(),setStrategy(in Strategy) 方法可以动态地改变 strategy 对象,也就是说能动态地改变 Context 所使用的算法。 + +

+ +### 实现 + +设计一个鸭子,它可以动态地改变叫声。这里的算法族是鸭子的叫声行为。 + +```java +public interface QuackBehavior { + void quack(); +} +``` + +```java +public class Quack implements QuackBehavior { + @Override + public void quack() { + System.out.println("quack!"); + } +} +``` + +```java +public class Squeak implements QuackBehavior{ + @Override + public void quack() { + System.out.println("squeak!"); + } +} +``` + +```java +public class Duck { + private QuackBehavior quackBehavior; + + public void performQuack() { + if (quackBehavior != null) { + quackBehavior.quack(); + } + } + + public void setQuackBehavior(QuackBehavior quackBehavior) { + this.quackBehavior = quackBehavior; + } +} +``` + +```java +public class Client { + public static void main(String[] args) { + Duck duck = new Duck(); + duck.setQuackBehavior(new Squeak()); + duck.performQuack(); + duck.setQuackBehavior(new Quack()); + duck.performQuack(); + } +} +``` + +```html +squeak! +quack! +``` ### JDK diff --git a/pics/4dc08713-f6fe-424c-a24c-ad5a993a941d.png b/pics/4dc08713-f6fe-424c-a24c-ad5a993a941d.png new file mode 100644 index 00000000..8a0b1d3f Binary files /dev/null and b/pics/4dc08713-f6fe-424c-a24c-ad5a993a941d.png differ