策略模式

定义:

策略模式定义了一系列的算法,并将每一个算法封装起来,而且使他们可以相互替换,让算法独立于使用它的客户而独立变化。
分析下定义,策略模式定义和封装了一系列的算法,它们是可以相互替换的,也就是说它们具有共性,而它们的共性就体现在策略接口的行为上,另外为了达到最后一句话的目的,也就是说让算法独立于使用它的客户而独立变化,我们需要让客户端依赖于策略接口。

策略模式的使用场景:

1.针对同一类型问题的多种处理方式,仅仅是具体行为有差别时,例如支付,支付方式可以有多种,但只需提供一个对外接口即可;
2.需要安全地封装多种同一类型的操作时;
3.出现同一抽象类有多个子类,而又需要使用 if-else 或者 switch-case 来选择具体子类时。

抽象策略类

/**
*统一下单接口
*/
public interface IPay {
    void pay();
}

###具体策略类

@Service("AppPay")
public class AppIPay implements IPay {
    @Override
    public void pay() {
        System.out.println("AppPay");
    }
}

@Service("QrCodePay")
public class QrCodeIPay implements IPay {
    @Override
    public void pay() {
        System.out.println("QrCodePay");
    }
}
//新增其他支付方式只需实现IPay


//将策略实现类注入到map
@Component
public class PayFactory {
    private Map <String, IPay> factoryMap = new ConcurrentHashMap <>();
    /**
     * @Autowired 修饰构造函数,Spring会将实现了IPay接口的Bean,默认首字母小写,注入到map中
     * @param map
     */
    @Autowired
    public PayFactory(Map <String, IPay> map) {
        this.factoryMap.clear();
        map.forEach((k, v) -> this.factoryMap.put(k, v));
    }

    public IPay getPay(String type) {
        return factoryMap.get(type);
    }
}
public enum TopupEnum {

    QrCodePay("0302", "QrCodePay"),
    WxH5Pay("0502", "WxH5Pay"),
    WxJsPay("0602", "JsPay"),
    AliJsPay("0702", "JsPay"),
    WxAppPay("0802", "AppPay"),
    AliAppPay("0902", "AppPay");
	/**
	*支付方式
	*/
    private String topupType;
	/**
	*策略实现类名字   @Service("AppPay")
	*/
    private String value;
  
    public static TopupEnum value(String topupType) {
        for (TopupEnum topupEnum : TopupEnum.values()) {
            if (topupEnum.getTopupType().equalsIgnoreCase(topupType)) {
                return topupEnum;
            }
        }
        return null;
    }
}

###提供对外下单接口

//根据支付方式调用对应的实现方法  每种支付方式对应的值自己定义
public void test() {
IPay iPay = payFactory.getPay(TopupEnum.value("0802").getValue());
//输出AppPay
pay.pay();
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值