From f7577dc5fdc8fed2ac1b5cf5e9d492f0d62e3039 Mon Sep 17 00:00:00 2001 From: CyC2018 Date: Wed, 4 Nov 2026 22:39:59 +0800 Subject: [PATCH] =?UTF-8?q?Update=20=E8=AE=BE=E8=AE=A1=E6=A8=A1=E5=BC=8F?= =?UTF-8?q?=20-=20=E7=AD=96=E7=95=A5.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 实现一节改用运费的例子演示 Context,类图说明同步。 --- notes/设计模式 - 策略.md | 97 +++++++++++++++------------------------- 1 file changed, 36 insertions(+), 61 deletions(-) diff --git a/notes/设计模式 - 策略.md b/notes/设计模式 - 策略.md index 8b617812..04806d4a 100644 --- a/notes/设计模式 - 策略.md +++ b/notes/设计模式 - 策略.md @@ -9,71 +9,11 @@ - Strategy 接口定义了一个算法族,它们都实现了 behavior() 方法; - Context 是使用到该算法族的类,其中的 doSomething() 方法会调用 behavior(),setStrategy(Strategy) 方法可以动态地改变 strategy 对象,即可以在运行时更换 Context 使用的算法。 -下图按后文的鸭子示例画出:Duck 是 Context,QuackBehavior 是 Strategy,quack()、performQuack() 和 setQuackBehavior() 分别对应 behavior()、doSomething() 和 setStrategy()。 +下图按后文的运费示例画出:Order 是 Context,FreightStrategy 是 Strategy,fee()、freight() 和 setFreightStrategy() 分别对应 behavior()、doSomething() 和 setStrategy()。

### 实现 -设计一个鸭子,它可以动态地改变叫声。这里的算法族是鸭子的叫声行为。 - -```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(); - } -} -``` - -```text -squeak! -quack! -``` #### 1. 用策略替代 if-else @@ -132,6 +72,41 @@ public class PickupFreight implements FreightStrategy { } ``` +Order 是 Context,持有一个运费策略,计算运费时交给它;用户改选配送方式时,换一个策略对象即可: + +```java +public class Order { + + private FreightStrategy freightStrategy; + + public void setFreightStrategy(FreightStrategy freightStrategy) { + this.freightStrategy = freightStrategy; + } + + public int freight(int kg) { + return freightStrategy.fee(kg); + } +} +``` + +```java +public class Client { + + public static void main(String[] args) { + Order order = new Order(); + order.setFreightStrategy(new StandardFreight()); + System.out.println(order.freight(3)); + order.setFreightStrategy(new ExpressFreight()); // 用户改选加急 + System.out.println(order.freight(3)); + } +} +``` + +```text +16 +37 +``` + 同样的结构也适用于支付渠道、消息推送渠道等场景,只是各实现类的内容换成对应的处理逻辑。 #### 2. 与简单工厂和 Spring 容器结合