1、策略模式(Strategy)属于设计模式中的行为型模式。
2、策略模式定义了一组能够用来标识可能行为的类集合。这些行为可以在应用程序中使用,用来实现业务功能。
下图类图就是策略模式的一种实现:
场景释义:
在执行付款的时候可以有很多种付款方式,比如微信、支付宝、华为支付等等。
每种支付的处理流程可能也不尽相同,这种时候就可以采用策略模式,后续新增支付方式的时候,只需要添加接口实现类。
1、在类自身定义了每一个行为,这样就减少了条件判断语句。
2、使得功能更加容易扩展,在不对调用代码进行修改的情况下,新增类就可以让程序具有新增的行为。
应用场景:在有多种算法相似的情况下,解决 if...else分支过多的场景,因为其不利于维护和扩展 。
何时使用:一个系统有许多许多类,而区分它们的只是他们直接的行为。
如何解决:将这些算法封装成独立的类,任意地替换。
关键代码:实现同一个接口。
业务场景:
1、一个付款单支持多种付款方式。
2、不同付款方式其内部处理逻辑不同。
- // 未使用【策略模式】执行支付判断和处理
- Payment payment = new Payment();
- if ("AliPay".equals(payment.getPayMode())) {
- System.out.println("【支付宝】支付");
- System.out.println("返回支付结果");
- } else if ("WeixinPay".equals(payment.getPayMode())) {
- System.out.println("【微信】支付");
- System.out.println("返回支付结果");
- } else if ("HuaweiPay".equals(payment.getPayMode())) {
- System.out.println("【华为】支付");
- System.out.println("返回支付结果");
- } else if ("xxx".equals(payment.getPayMode())) {
- System.out.println("【xxx】支付");
- System.out.println("返回支付结果");
- }
好处:
1、去除了之前多个if-else判断分支。
2、使得功能更加容易扩展。比如新增新的支付方式时,只需要新增接口实现类。
- private static List<IPayService> payServices = new ArrayList<>();
-
- static {
- payServices.add(new AliPayService());
- payServices.add(new WeixinPayService());
- payServices.add(new HuaweiPayService());
- }
-
- // 使用【策略模式】执行支付判断和处理
- Payment payment = new Payment();
- for (IPayService payService : payServices) {
- if (payService.support(payment)) {
- payService.handlePayment(payment);
- }
- }
定义支付接口:
- /**
- * 支付接口定义
- *
- * @author chenliwu
- * @since 2022-06-29
- */
- public interface IPayService {
- /**
- * 是否支持支付
- *
- * @param payment 支付清单
- * @return 是否支持支付
- */
- boolean support(Payment payment);
-
- /**
- * 付款
- *
- * @param payment 支付清单
- * @return 付款结果
- */
- boolean handlePayment(Payment payment);
- }
具体支付实现类:
1、支付宝支付:
- public class AliPayService implements IPayService {
- @Override
- public boolean support(Payment payment) {
- System.out.println("判断是否支持【支付宝】支付");
- return false;
- }
-
- @Override
- public boolean handlePayment(Payment payment) {
- System.out.println("【支付宝】支付");
- return false;
- }
- }
2、微信支付:
- /**
- * 微信支付实现
- *
- * @author chenliwu
- * @since 2022-06-29
- */
- public class WeixinPayService implements IPayService {
- @Override
- public boolean support(Payment payment) {
- System.out.println("判断是否支持【微信】支付");
- return false;
- }
-
- @Override
- public boolean handlePayment(Payment payment) {
- System.out.println("【微信】支付");
- return false;
- }
- }
3、华为支付:
- /**
- * 华为-支付实现
- *
- * @author chenliwu
- * @since 2022-06-29
- */
- public class HuaweiPayService implements IPayService {
- @Override
- public boolean support(Payment payment) {
- System.out.println("判断是否支持【华为】支付");
- return false;
- }
-
- @Override
- public boolean handlePayment(Payment payment) {
- System.out.println("【华为】支付");
- return false;
- }
- }