策略模式就是定义了一系列算法(或策略),并将每个算法封装起来,使它们可以互相替换。这种模式让算法的变化独立于使用算法的客户。

例子

想象一下你开了一家快餐店,提供三种支付方式:现金支付、信用卡支付和微信支付。顾客可以选择任何一种方式来付款。这里,支付方式就是不同的“策略”。 代码实现 策略接口:定义支付方式的接口。 具体策略:实现不同的支付方式。 上下文:使用策略的地方。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
// 策略接口 
interface PaymentStrategy { void pay(int amount); }
// 具体策略:现金支付
class CashPayment implements PaymentStrategy { public void pay(int amount) { System.out.println("使用现金支付了 " + amount + " 元"); } }
// 具体策略:信用卡支付
class CreditCardPayment implements PaymentStrategy { public void pay(int amount) { System.out.println("使用信用卡支付了 " + amount + " 元"); } }
// 具体策略:微信支付
class WeChatPayment implements PaymentStrategy { public void pay(int amount) { System.out.println("使用微信支付了 " + amount + " 元"); } }

// 上下文:使用支付策略的地方
class PaymentContext { private PaymentStrategy strategy;
// 设置支付策略
public void setPaymentStrategy(PaymentStrategy strategy) { this.strategy = strategy; }
// 执行支付
public void pay(int amount) { strategy.pay(amount); } }
使用的时候:context.setPaymentStrategy(new CashPayment());

面试的时候,可以用5W1H(即What, Why, When, Where, Who, How)思维来整理一下策略模式的解释,这样你在面试时就能条理清晰地回答了。 话术 What(是什么): 策略模式是一种行为设计模式,它定义了一系列算法,并将每个算法封装起来,使它们可以互相替换。 Why(为什么需要它): 我们使用策略模式是为了使得算法的变化独立于使用算法的客户。这样可以提高代码的灵活性和可维护性,避免在同一地方写大量的条件判断逻辑。 When(在什么时候使用): 当我们有多种算法可以选择,并且这些算法可以在运行时互相替换时,策略模式是一个很好的选择。比如支付方式、排序算法等场景。 Where(在哪里使用): 策略模式常用于需要动态选择算法的地方,比如电商平台的不同支付方式、游戏中的不同攻击策略等。 Who(谁来使用): 策略模式的使用者通常是需要执行某种行为的对象,比如支付系统中的支付处理器,游戏中的角色等。 How(如何实现): 我们通过定义一个策略接口,然后实现多个具体的策略类,再在上下文类中使用这些策略。上下文类负责根据具体情况选择和执行策略。 综合这几个点,面试时你可以这么说: “策略模式是一种行为设计模式,它定义了一系列算法,并将每个算法封装起来,使它们可以互相替换。我们使用策略模式是为了提高代码的灵活性和可维护性,避免在同一地方写大量的条件判断逻辑。当我们有多种算法可以选择,并且这些算法可以在运行时互相替换时,比如在电商平台的不同支付方式或游戏中的不同攻击策略时,就可以使用策略模式。具体实现上,我们通过定义一个策略接口,然后实现多个具体的策略类,再在上下文类中使用这些策略,上下文类负责根据具体情况选择和执行策略。”