策略模式

什么是策略模式?根据不同的 条件 得到不同的结果。所谓策略就是一种方案,策略模式就是一种方案的选择。比如 支付:微信支付,支付宝支付,银联支付等,让用户来选择一种支付方式,这就是一种策略。

首先来看看不使用 策略模式下,实现上面功能的代码。

public class PayDemo {

    public void pay(String pay) {
     if ("微信支付".equals(pay)) {
         System.out.println("微信支付 ");
     }
     if ("支付宝支付".equals(pay)) {
         System.out.println("支付宝支付 ");
     }
     if ("银联支付".equals(pay)) {
         System.out.println("银联支付 ");
     }
    }

    public static void main(String[] args) {
        PayDemo payDemo = new PayDemo();
        payDemo.pay("微信支付");
    }


}
  • 上面的代码有一些缺点:1. if 条件多,如果if 多,代码非常臃肿 2. 扩展性差,如果新加一个 支付方式,则会多加 一个if 和对应的支付逻辑。

优化方案: 使用策略模式

/**
 * 支付功能接口
 */
public interface Pay {
    void pay();
}

public class AliPay implements Pay {
    @Override
    public void pay() {
        System.out.println("支付宝支付!");
    }
}
public class WXPay implements Pay {
    @Override
    public void pay() {
        System.out.println("微信支付!");
    }
}
public class YLPay implements Pay {
    @Override
    public void pay() {
        System.out.println("银联支付!");
    }
}
  • PayStrategy 策略类
public class PayStrategy {

    private static final Map payMap = new ConcurrentHashMap<>();
    static {
        payMap.put(payType.WX,new WXPay());
        payMap.put(payType.Ali,new AliPay());
        payMap.put(payType.YL,new YLPay());
    }
     enum payType {
        WX,
        Ali,
        YL,
    }

    public static Pay getPay(payType pay) {
       return payMap.get(pay);
    }
    public static void main(String[] args) {
        PayStrategy.getPay(payType.Ali).pay();// 更具 key 去获取
    }
}

简单点说,策略模式里面定义了相同的功能(支付功能),封装了不同的实现(微信支付,支付宝支付),算法之间可以相互替换。策略类中 初始化了所有的算法实现,使用者只需要根据需求去获取对应的算法,去完成业务逻辑实现。

你可能感兴趣的:(策略模式)