前言

生活中最常见的比如现在的聚合支付、出行交通等都可以看做是一种策略模式。简而言之既使用不同的方法,达到相同的目的。或者说过程不同,但结果一样。

代码示例

package com.strategy;

import java.math.BigDecimal;

public interface Payment {

    void pay(BigDecimal amout);
}
package com.strategy;

import java.math.BigDecimal;

public class AliPay implements Payment {
    @Override
    public void pay(BigDecimal amout) {
        System.out.println("支付宝支付逻辑,支付金额:" + amout.toString());
    }
}
package com.strategy;

import java.math.BigDecimal;

public class WechatPay implements Payment {
    @Override
    public void pay(BigDecimal amout) {
        System.out.println("微信支付逻辑,支付金额:" + amout.toString());
    }
}
package com.strategy;

import java.math.BigDecimal;

public class UnitTest {
    public static void main(String[] args) {
        BigDecimal bigDecimal = new BigDecimal("10.1");
        String code = "wechat";
        doPaying(code, bigDecimal);
    }

    private static void doPaying(String code, BigDecimal decimal) {
        Payment payment;
        System.out.println("要付款100块");
        //获取支付渠道标识
        if (code.equalsIgnoreCase("ali")) {
            payment = new AliPay();
        } else {
            payment = new WechatPay();
        }
        //策略模式的核心不是消除 if else 是分离算法的实现和使用
        payment.pay(decimal);
    }
}

优缺点总结

优点:

  1. 我们将算法的实现和算法的使用进行了隔离,算法实现只关心算法逻辑,使用算法只关心什么条件下使用什么算法。
  2. 开闭原则,无需修改上下文对象,想扩展只需要引入新的策略。
  3. 运行时根据条件动态的去切换算法。
  4. 适应个性的同时也可以兼容共性。

缺点:

  1. 客户端必须明确知道激活策略的条件。
  2. 引入太多的策略类。
  3. ......