介绍

策略模式(Strategy Pattern):该模式定义了一系列算法,并将每个算法封装起来,使它们可以相互替换,且算法的变化不会影响使用算法的客户。策略模式属于对象行为模式,它通过对算法进行封装,把使用算法的责任和算法的实现分割开来,并委派给不同的对象对这些算法进行管理。最主要的特点是一个类的行为或其算法可以在运行时更改。

类图

image-20220223112148730

类图说明:

  • 策略(PayMethod):策略是一个接口,该接口定义算法标识。
  • 具体策略(WeChatPayAliPayAliPay):具体策略是实现策略接口的类。具体策略实现策略接口所定义的抽象方法,即给出算法标识的具体算法。
  • 环境类(Pay):持有一个策略类的引用,最终给客户端调用。

我们用支付来演示一下策略模式,PayMethod为支付方式接口,定义了支付方式,WeChatPay为微信支付,实现了PayMethod接口,AliPay为支付宝支付,实现了PayMethod接口,BankCardPay为银行卡支付,也实现了PayMethod接口。三种不同的类都实现了同一个接口,只是内部实现不一样。Pay为支付接口,定
义了支付功能,Pay组合了PayMethod接口,这样就可以再使用支付时可以使用不同的支付方式进行支付,下面看代码实例:

代码分析

PayMethod接口

1
2
3
4
5
public interface PayMethod {

void pay();

}

WeChatPay类,实现了PayMethod接口

1
2
3
4
5
6
public class WeChatPay implements PayMethod {
@Override
public void pay() {
System.out.println("微信支付...");
}
}

AliPay类,实现了PayMethod接口

1
2
3
4
5
6
public class AliPay implements PayMethod {
@Override
public void pay() {
System.out.println("支付宝支付...");
}
}

BankCardPay类,实现了PayMethod接口

1
2
3
4
5
6
public class BankCardPay implements PayMethod {
@Override
public void pay() {
System.out.println("银行卡支付...");
}
}

Pay

1
2
3
4
5
6
7
8
9
10
11
12
13
14
public class Pay {

//支付方式
private PayMethod payMethod;

public Pay(PayMethod payMethod){
this.payMethod = payMethod;
}

//支付
public void payment(){
payMethod.pay();
}
}

测试截图

image-20220223112229092

优点

  • 策略模式提供了对“开闭原则”的完美支持,用户可以在不修改原有系统的基础上选择算法或行为,也可以灵活地增加新的算法或行为。
  • 策略模式提供了管理相关的算法族的办法。
  • 策略模式提供了可以替换继承关系的办法。
  • 使用策略模式可以避免使用多重条件转移语句。

缺点

  • 客户端必须知道所有的策略类,并自行决定使用哪一个策略类。
  • 策略模式将造成产生很多策略类,可以通过使用享元模式在一定程度上减少对象的数量。