1.定义共同的方法和行为
package com.ultiwill.strategy;public interface PayStrategy { /** * 共同的行为方法 * @return */ String toPayHtml();}
2. 三种具体策略的实现 (阿里支付, 微信支付, 小米支付)
package com.ultiwill.strategy.impl;import com.ultiwill.strategy.PayStrategy;/** * @author chong.zuo * @date 2020/9/24 15:21 */public class AliPayStrategy implements PayStrategy { @Override public String toPayHtml() { return "调用阿里支付...AliPayStrategy"; }}
package com.ultiwill.strategy.impl;import com.ultiwill.strategy.PayStrategy;/** * @author chong.zuo * @date 2020/9/24 15:29 */public class WeChatPayStrategy implements PayStrategy { @Override public String toPayHtml() { return "调用微信支付...WeChatPayStrategy"; }}
package com.ultiwill.strategy.impl;import com.ultiwill.strategy.PayStrategy;/** * @author chong.zuo * @date 2020/9/24 15:34 */public class XiaomiPayStrategy implements PayStrategy { @Override public String toPayHtml() { return "调用小米支付...XiaomiPayStrategy"; }}
3. 枚举类定义映射地址
package com.ultiwill.strategy.enums;import org.apache.commons.lang.StringUtils;/*** 枚举* @author chong.zuo* @date 2020/9/24 15:45*/public enum PayEnumStrategy { /** * 阿里支付 */ ALI_PAY("1","com.ultiwill.strategy.impl.AliPayStrategy"), /** * 微信支付 */ WECHAT_PAY("2","com.ultiwill.strategy.impl.WeChatPayStrategy"), /** * 小米支付 */ XIAOMI_PAY("3","com.ultiwill.strategy.impl.XiaomiPayStrategy"); private String code; private String className; PayEnumStrategy() { } PayEnumStrategy(String code, String className) { this.code = code; this.className = className; } public static String getClassNameByCode(String code) { String className = ""; if (StringUtils.isEmpty(code)) { return className; } for (PayEnumStrategy e : PayEnumStrategy.values()) { if (e.code.equalsIgnoreCase(code)) { className = e.className; break; } } return className; } public String getCode() { return code; } public String getClassName() { return className; }}
4.工厂类反射执行
package com.ultiwill.strategy.factory;import com.ultiwill.strategy.PayStrategy;import com.ultiwill.strategy.enums.PayEnumStrategy;/** * @author chong.zuo * @date 2020/9/24 16:10 */public class StrategyFactory { /** * 使用策略工厂获取具体策略实现 * @param code * @return */ public static PayStrategy getPayStrategy(String code) { try { return (PayStrategy) Class.forName(PayEnumStrategy.getClassNameByCode(code)).newInstance(); } catch (InstantiationException e) { e.printStackTrace(); } catch (IllegalAccessException e) { e.printStackTrace(); } catch (ClassNotFoundException e) { e.printStackTrace(); } return null; }}
使用
/** * 上下文 * * @author chong.zuo * @date 2020/9/24 15:41 */public class PayContextStrategy { /** * 获取具体的策略实现 * * @param code * @return */ public static String toPayHtml(String code) { if (StringUtils.isBlank(code)) { return "code不能为空..."; } PayStrategy payStrategy = StrategyFactory.getPayStrategy(code); if (payStrategy == null) { return "没有找到具体的策略..."; } return payStrategy.toPayHtml(); }}