场景:通常支付类型有多种,我们需要根据不同的支付方式实现不同的支付代码逻辑
public void pay(String type)
{
List<PayModeEnum> eumValueList = PayModeEnum.getEumValueList();
List<String> payModeList = eumValueList.stream().map(s -> s.getCode()).collect(Collectors.toList());
if(!payModeList.contains(type)){
throw new RuntimeException("暂不支持该支付方式");
}
if (PayModeEnum.CARD_PAY.getCode().equals(type)) {
//银行卡支付实现代码
}
if (PayModeEnum.WEIXIN_PAY.getCode().equals(type)) {
//微信支付实现代码
}
if (PayModeEnum.ALIPAY_PAY.getCode().equals(type)) {
//支付宝支付实现代码
}
}
如果还有更多的支付方式的话,我们的操作逻辑会更复杂
下面我们使用策略模式+工厂模式优化
首先建立一个获取策略的工厂
public class PayFactory {
private static Map<String,AbstractPayHandler> strategyMap = new ConcurrentHashMap<>();
public static void register(String name,AbstractPayHandler handler){
strategyMap.put(name,handler);
}
public static AbstractPayHandler getInvokeStrategy(String name){
return strategyMap.get(name);
}
}
然后新建策略抽象类
public abstract class AbstractPayHandler implements InitializingBean {
/**
* 实现具体的支付操作
*/
public abstract void pay();
}
微信支付策略实现类
@Component
class WeixinPayHandle extends AbstractPayHandler {
@Override
public void pay() {
System.out.println("WeixinPayHandle.pay");
}
@Override
public void afterPropertiesSet() throws Exception {
PayFactory.register("weixin",this);
}
}
银行卡支付策略实现
@Component
class CardPayHandle extends AbstractPayHandler {
@Override
public void pay() {
System.out.println("CardPayHandle.pay");
}
@Override
public void afterPropertiesSet() throws Exception {
PayFactory.register("card",this);
}
}
其他支付方式类似
测试类
@RunWith(SpringRunner.class)
@SpringBootTest(classes = TestApplication.class)
public class PayTest {
@Test
public void getPay(){
String name="weixin";
AbstractPayHandler handler = PayFactory.getInvokeStrategy(name);
if( handler==null){
System.out.println("PayTest.getPay");
return ;
}
handler.pay();
}
}
测试结果