优化前
在代码中,经常会出现很多ifelse的语句,如:
if(网银支付){
代码1
}else if(微信支付){
代码2
}else if(支付宝支付){
代码3
}
订单支付模块,可能会有很多支付渠道,一般的做法可能是通过ifelse来判断使用哪个渠道。这样代码不友好,代码比较耦合。
优化后
使用策略模式来优化代码。策略模式:定义好规则,根据不同的规则执行不同的代码。
以支付模块为例:
支付接口
public interface PayStrategy {
OrderInfo createOrderInfo(OrderInfo orderInfo);
}
微信策略类
public class WxpayStrategy implements PayStrategy {
@Override
public OrderInfo createOrderInfo(OrderInfo orderInfo) {
System.out.println("微信支付");
return null;
}
}
支付宝策略类
public class AlipayStrategy implements PayStrategy {
@Override
public OrderInfo createOrderInfo(OrderInfo orderInfo) {
System.out.println("支付宝支付");
return null;
}
}
上下文类
public class Context {
private PayStrategy payStrategy;
public void setStrategy(PayStrategy payStrategy){
this.payStrategy = payStrategy;
}
public OrderInfo createOrderInfo(OrderInfo orderInfo){
return payStrategy.createOrderInfo(orderInfo);
}
}
测试类
public class Test {
public static void main(String[] args) {
Context context = new Context();
context.setStrategy(new AlipayStrategy());
context.createOrderInfo(new OrderInfo());
}
}
spring整合策略模式
支付策略接口
public interface PayStrategy {
PayTypeEnum payType();
OrderInfo createOrderInfo(OrderInfo orderInfo);
}
微信策略类
@Service
public class WxpayStrategy implements PayStrategy {
@Override
public PayTypeEnum payType() {
return PayTypeEnum.WXPAY;
}
@Override
public OrderInfo createOrderInfo(OrderInfo orderInfo) {
System.out.println("微信支付");
return null;
}
}
支付宝策略类
@Service
public class AlipayStrategy implements PayStrategy {
@Override
public PayTypeEnum payType() {
return PayTypeEnum.ALIPAY;
}
@Override
public OrderInfo createOrderInfo(OrderInfo orderInfo) {
System.out.println("支付宝支付");
return null;
}
}
上下文类
@Service
public class Context {
private PayStrategy getHandler(String payType){
if(StringUtils.isEmpty(payType)){
payType = ShareTypeEnum.ABOUT.getKey();
}
List<PayStrategy> strategies = SpringContextUtils.getBeans(PayStrategy.class);
for (PayStrategy strategy : strategies) {
if (strategy.payType().getKey().equals(payType)) {
return strategy;
}
}
throw new RuntimeException("异常");
}
public OrderInfo createOrderInfo(OrderInfo orderInfo,String payType){
PayStrategy payStrategy = getHandler(payType);
return payStrategy.createOrderInfo(orderInfo);
}
}
枚举类
public enum PayTypeEnum {
/**
*
*/
ALIPAY("alipay","支付宝"),
WXPAY("wxpay","微信");
String key;
String value;
PayTypeEnum(String key, String value) {
this.key = key;
this.value = value;
}
public String getKey() {
return key;
}
public String getValue() {
return value;
}
public static PayTypeEnum getEnumByKey(String key){
for(PayTypeEnum payTypeEnum : PayTypeEnum.values()){
if(payTypeEnum.getKey().equals(key)){
return payTypeEnum;
}
}
return null;
}
}
测试类
public class Test extends BaseServiceTest {
@Autowired
private Context context;
@org.junit.Test
public void test(){
context.createOrderInfo(new OrderInfo(),PayTypeEnum.ALIPAY.getKey());
}
}
这样如果新增一种支付方式,你只需要新增一个策略处理类就可以了,对原先的业务没有任何影响。
本文为博主原创文章,未经博主允许不得转载。
更多内容请访问:IT源点
注意:本文归作者所有,未经作者允许,不得转载