设计模式-策略模式
业务场景
项目需要对接支付系统,根据不同客户类型会有不同的支付方式,比如:支付宝、微信、银联、云闪付等等其他第三方支付平台,这个时候策略模式就大展身手了。
传统的if/else/switch 等等判断的写法太low了,代码糅合在一块,维护也不方便
核心
主要三个角色:
* 策略接口
* 策略实现
* 上下文
实现
- 策略接口
IPayment
public interface IPayment {
//支付方式
void pay(String method);
}
- 策略实现类
AliPay
public class AliPay implements IPayment {
@Override
public void pay(String method) {
System.out.println("使用支付宝支付...");
}
}
WechatPay
public class WechatPay implements IPayment {
@Override
public void pay(String method) {
System.out.println("使用微信支付...");
}
}
- 上下文
Context
public class Context {
private IPayment iPayment;
public Context(IPayment iPayment) {
this.iPayment = iPayment;
}
public void pay(String method) {
iPayment.pay(method);
}
}
测试
Test
public class Test {
public static void main(String[] args) {
//支付宝方式
IPayment aliPay = new AliPay();
aliPay.pay("使用支付宝支付");
//微信方式
IPayment wechatPay = new WechatPay();
wechatPay.pay("使用微信支付");
}
}
基于枚举的策略模式
Pay
public enum Pay {
Wechat(){
@Override
public void pay(String method) {
System.out.println("使用微信支付");
}
},
AliPay(){
@Override
public void pay(String method) {
System.out.println("使用支付宝支付");
}
}
;
public abstract void pay(String method);
}
测试
public static void main(String[] args) {
//原策略使用方式
strategy();
//使用枚举策略改进 消除if-else
enums("Wechat");
}
public static void strategy() {
//支付宝方式
IPayment aliPay = new AliPay();
aliPay.pay("使用支付宝支付");
//微信方式
IPayment wechatPay = new WechatPay();
wechatPay.pay("使用微信支付");
System.out.println("==================");
}
public static void enums(String method) {
Pay pay = Pay.valueOf(method);
pay.pay(method);
}