枚举实现策略设计模式 - 图1

1.定义共同的方法和行为

  1. package com.ultiwill.strategy;
  2. public interface PayStrategy {
  3. /**
  4. * 共同的行为方法
  5. * @return
  6. */
  7. String toPayHtml();
  8. }

2. 三种具体策略的实现 (阿里支付, 微信支付, 小米支付)

  1. package com.ultiwill.strategy.impl;
  2. import com.ultiwill.strategy.PayStrategy;
  3. /**
  4. * @author chong.zuo
  5. * @date 2020/9/24 15:21
  6. */
  7. public class AliPayStrategy implements PayStrategy {
  8. @Override
  9. public String toPayHtml() {
  10. return "调用阿里支付...AliPayStrategy";
  11. }
  12. }
  1. package com.ultiwill.strategy.impl;
  2. import com.ultiwill.strategy.PayStrategy;
  3. /**
  4. * @author chong.zuo
  5. * @date 2020/9/24 15:29
  6. */
  7. public class WeChatPayStrategy implements PayStrategy {
  8. @Override
  9. public String toPayHtml() {
  10. return "调用微信支付...WeChatPayStrategy";
  11. }
  12. }
  1. package com.ultiwill.strategy.impl;
  2. import com.ultiwill.strategy.PayStrategy;
  3. /**
  4. * @author chong.zuo
  5. * @date 2020/9/24 15:34
  6. */
  7. public class XiaomiPayStrategy implements PayStrategy {
  8. @Override
  9. public String toPayHtml() {
  10. return "调用小米支付...XiaomiPayStrategy";
  11. }
  12. }

3. 枚举类定义映射地址

  1. package com.ultiwill.strategy.enums;
  2. import org.apache.commons.lang.StringUtils;
  3. /**
  4. * 枚举
  5. * @author chong.zuo
  6. * @date 2020/9/24 15:45
  7. */
  8. public enum PayEnumStrategy {
  9. /**
  10. * 阿里支付
  11. */
  12. ALI_PAY("1","com.ultiwill.strategy.impl.AliPayStrategy"),
  13. /**
  14. * 微信支付
  15. */
  16. WECHAT_PAY("2","com.ultiwill.strategy.impl.WeChatPayStrategy"),
  17. /**
  18. * 小米支付
  19. */
  20. XIAOMI_PAY("3","com.ultiwill.strategy.impl.XiaomiPayStrategy");
  21. private String code;
  22. private String className;
  23. PayEnumStrategy() {
  24. }
  25. PayEnumStrategy(String code, String className) {
  26. this.code = code;
  27. this.className = className;
  28. }
  29. public static String getClassNameByCode(String code) {
  30. String className = "";
  31. if (StringUtils.isEmpty(code)) {
  32. return className;
  33. }
  34. for (PayEnumStrategy e : PayEnumStrategy.values()) {
  35. if (e.code.equalsIgnoreCase(code)) {
  36. className = e.className;
  37. break;
  38. }
  39. }
  40. return className;
  41. }
  42. public String getCode() {
  43. return code;
  44. }
  45. public String getClassName() {
  46. return className;
  47. }
  48. }

4.工厂类反射执行

  1. package com.ultiwill.strategy.factory;
  2. import com.ultiwill.strategy.PayStrategy;
  3. import com.ultiwill.strategy.enums.PayEnumStrategy;
  4. /**
  5. * @author chong.zuo
  6. * @date 2020/9/24 16:10
  7. */
  8. public class StrategyFactory {
  9. /**
  10. * 使用策略工厂获取具体策略实现
  11. * @param code
  12. * @return
  13. */
  14. public static PayStrategy getPayStrategy(String code) {
  15. try {
  16. return (PayStrategy) Class.forName(PayEnumStrategy.getClassNameByCode(code)).newInstance();
  17. } catch (InstantiationException e) {
  18. e.printStackTrace();
  19. } catch (IllegalAccessException e) {
  20. e.printStackTrace();
  21. } catch (ClassNotFoundException e) {
  22. e.printStackTrace();
  23. }
  24. return null;
  25. }
  26. }

使用

  1. /**
  2. * 上下文
  3. *
  4. * @author chong.zuo
  5. * @date 2020/9/24 15:41
  6. */
  7. public class PayContextStrategy {
  8. /**
  9. * 获取具体的策略实现
  10. *
  11. * @param code
  12. * @return
  13. */
  14. public static String toPayHtml(String code) {
  15. if (StringUtils.isBlank(code)) {
  16. return "code不能为空...";
  17. }
  18. PayStrategy payStrategy = StrategyFactory.getPayStrategy(code);
  19. if (payStrategy == null) {
  20. return "没有找到具体的策略...";
  21. }
  22. return payStrategy.toPayHtml();
  23. }
  24. }