策略模式
2019-08-23 本文已影响0人
愤怒的奶牛
什么是策略模式?根据不同的 条件 得到不同的结果。所谓策略就是一种方案,策略模式就是一种方案的选择。比如 支付:微信支付,支付宝支付,银联支付等,让用户来选择一种支付方式,这就是一种策略。
首先来看看不使用 策略模式下,实现上面功能的代码。
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<payType, Pay> 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 去获取
}
}
简单点说,策略模式里面定义了相同的功能(支付功能),封装了不同的实现(微信支付,支付宝支付),算法之间可以相互替换。策略类中 初始化了所有的算法实现,使用者只需要根据需求去获取对应的算法,去完成业务逻辑实现。