当前位置:   article > 正文

Java设计模式——策略模式(解决满屏的if/else)_java很多if用什么设计模式

java很多if用什么设计模式

一、业务场景

项目需要对接支付系统,根据不同客户类型会有不同的支付方式,比如:支付宝、微信、银联、云闪付等等其他第三方支付平台,这个时候策略模式就大展身手了。

传统的if/else/switch 等等判断的写法太low了,代码糅合在一块,维护也不方便。

二、简单代码示例

1、实体类准备

订单信息类

  1. package com.iot.designpattern.strategy.model;
  2. import lombok.Data;
  3. import lombok.experimental.Accessors;
  4. /**
  5. * 订单信息
  6. *
  7. * @author Mr.Qu
  8. * @since 2021/5/18 10:56
  9. */
  10. @Data
  11. @Accessors(chain = true)
  12. public class Order {
  13. /**
  14. * 金额
  15. */
  16. private int amount;
  17. /**
  18. * 支付类型
  19. */
  20. private String type;
  21. }

返回结果类

  1. package com.iot.designpattern.strategy.model;
  2. import lombok.AllArgsConstructor;
  3. import lombok.Data;
  4. import lombok.NoArgsConstructor;
  5. /**
  6. * 支付结果
  7. *
  8. * @author Mr.Qu
  9. * @since 2021/5/18 10:59
  10. */
  11. @Data
  12. @AllArgsConstructor
  13. @NoArgsConstructor
  14. public class PayResult {
  15. /**
  16. * 响应码
  17. */
  18. private int code;
  19. /**
  20. * 提示信息
  21. */
  22. private String msg;
  23. public static PayResult success(String msg) {
  24. return new PayResult(200, msg);
  25. }
  26. }

2、定义策略接口(所有支付方式的接口),策略接口如下:

  1. package com.iot.designpattern.strategy.service;
  2. import com.iot.designpattern.strategy.model.Order;
  3. import com.iot.designpattern.strategy.model.PayResult;
  4. /**
  5. * 支付接口
  6. *
  7. * @author Mr.Qu
  8. * @since 2021/5/18 10:52
  9. */
  10. public interface IPayment {
  11. /**
  12. * 支付
  13. *
  14. * @param order 订单信息
  15. * @return PayResult 支付结果
  16. */
  17. PayResult pay(Order order);
  18. }

3、定义各种策略实现类

支付宝支付实现类:

  1. package com.iot.designpattern.strategy.service.Impl;
  2. import com.iot.designpattern.strategy.model.Order;
  3. import com.iot.designpattern.strategy.model.PayResult;
  4. import com.iot.designpattern.strategy.service.IPayment;
  5. import org.springframework.stereotype.Service;
  6. /**
  7. * 支付宝支付
  8. *
  9. * @author Mr.Qu
  10. * @since 2021/5/18 11:08
  11. */
  12. @Service
  13. public class AliPay implements IPayment {
  14. @Override
  15. public PayResult pay(Order order) {
  16. return new PayResult(200, "支付宝支付成功");
  17. }
  18. }

微信支付实现类:

  1. package com.iot.designpattern.strategy.service.Impl;
  2. import com.iot.designpattern.strategy.model.Order;
  3. import com.iot.designpattern.strategy.model.PayResult;
  4. import com.iot.designpattern.strategy.service.IPayment;
  5. import org.springframework.stereotype.Service;
  6. /**
  7. * 微信支付
  8. *
  9. * @author Mr.Qu
  10. * @since 2021/5/18 10:58
  11. */
  12. @Service
  13. public class WechatPay implements IPayment {
  14. @Override
  15. public PayResult pay(Order order) {
  16. return new PayResult(200, "微信支付成功");
  17. }
  18. }

银联支付实现类:

  1. package com.iot.designpattern.strategy.service.Impl;
  2. import com.iot.designpattern.strategy.model.Order;
  3. import com.iot.designpattern.strategy.model.PayResult;
  4. import com.iot.designpattern.strategy.service.IPayment;
  5. import org.springframework.stereotype.Service;
  6. /**
  7. * 银联支付
  8. *
  9. * @author Mr.Qu
  10. * @since 2021/5/18 11:10
  11. */
  12. @Service
  13. public class UnionPay implements IPayment {
  14. @Override
  15. public PayResult pay(Order order) {
  16. System.out.println("开始银联支付");
  17. return PayResult.success("银联支付成功");
  18. }
  19. }

注:通过@Service注解将支付实现类注入spring工厂管理,默认bean名字是类名(开头小写)

4、使用策略

  1. package com.iot.designpattern.strategy.controller;
  2. import com.iot.designpattern.strategy.model.Order;
  3. import com.iot.designpattern.strategy.model.PayResult;
  4. import com.iot.designpattern.strategy.service.IPayment;
  5. import lombok.AllArgsConstructor;
  6. import org.springframework.context.ApplicationContext;
  7. import org.springframework.web.bind.annotation.GetMapping;
  8. import org.springframework.web.bind.annotation.RequestMapping;
  9. import org.springframework.web.bind.annotation.RestController;
  10. /**
  11. * 支付
  12. *
  13. * @author Mr.Qu
  14. * @since 2021/5/18 15:30
  15. */
  16. @RestController
  17. @AllArgsConstructor
  18. @RequestMapping("/pay/")
  19. public class PayController {
  20. private final ApplicationContext applicationContext;
  21. /**
  22. * 支付API
  23. *
  24. * @param amount 金额
  25. * @param payType 支付类型
  26. * @return PayResult
  27. */
  28. @GetMapping()
  29. public PayResult pay(int amount, String payType) {
  30. Order order = new Order().setAmount(amount).setType(payType);
  31. // 根据【支付类型】获取对应的策略 bean
  32. IPayment payment = applicationContext.getBean(payType, IPayment.class);
  33. // 开始调用策略对应的支付业务逻辑
  34. return payment.pay(order);
  35. }
  36. }

5、测试一下:

注:在调用的时候,注意payType中值为@Service对应的类名(开头小写),也可以自己在注解中命名name

三、总结

使用策略模式,我们可以干掉大量的if/else,代码也更优雅,还能灵活扩展。像本文中的支付案例,后面如果有别的支付方式,我们只需要写一个新的对应支付实现类即可,无需修改现有代码。

当然,完全干掉if/else是不可能的,不能过度设计,不能为了使用设计模式而使用设计模式。

策略模式的优点:

  1. 干掉繁琐的if、switch判断逻辑;
  2. 代码优雅、可服用、可读性好;
  3. 符合开闭原则、扩展性好、便于维护;

策略模式的缺点:

  1. 策略如果很多的话,会造成策略类膨胀;
  2. 使用者必须清楚所有的策略类及其用途;

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/菜鸟追梦旅行/article/detail/92789
推荐阅读
相关标签
  

闽ICP备14008679号