项目中订单支付为常见的功能,一般的订单支付都会包含多种方式,例如聚合支付、会员支付、积分支付的等多种方式,如果采用传统的方式来实现,需要使用多个if/else条件判断,本文将介绍如何采用策略+工厂模式实现多种方式的订单支付问题。
策略模式作为一种软件设计模式,指对象有某个行为,但是在不同的场景中,该行为有不同的实现算法。
基本元素组成如下:
public interface PayWayService
{
Result pay(WxPayObject wxpayObject);
}
说明:定义抽象支付接口。
@Component("wx")
public class WxPayWayServiceImpl implements PayWayService
{
private Logger logger =
LoggerFactory.getLogger(WxPayWayServiceImpl.class);
@Override
public Result pay(WxPayObject wxPayObject)
{
logger.info("this is wx pay way");
return Result.success(wxPayObject);
}
}
说明:注意@Component注解需要写入别名。
@Component("zfb")
public class ZfbPayWayServiceImpl implements PayWayService
{
private Logger logger =
LoggerFactory.getLogger(ZfbPayWayServiceImpl.class);
@Override
public Result pay(WxPayObject wxpayObject)
{
logger.info("this is zfb pay way");
return Result.success(wxpayObject);
}
}
@Component("member")
public class MemberPayWayServiceImpl implements PayWayService
{
private Logger logger =
LoggerFactory.getLogger(MemberPayWayServiceImpl.class);
@Override
public Result pay(WxPayObject wxpayObject)
{
logger.info("this is member pay way");
return Result.success(wxpayObject);
}
}
@Component
public class PayWayFactory
{
@Autowired
private Map paywayServiceMap;
public PayWayService getPayWayService(String type)
{
PayWayService payWayService = paywayServiceMap.get(type);
if(payWayService==null)
{
throw new RuntimeException("未指定的支付类型");
}
return payWayService;
}
}
说明:通过工厂类获取具体的策略实现。
private Map paywayServiceMap
@Autowired 标注作用于Map类型时,如果Map的key为String类型,则Spring 会将容器中所有类型符合 Map 的 value 对应的类型的 Bean 增加进来,用 Bean 的 iD 或 name 作为Map的key。
@RestController
public class TestController
{
@Autowired
private PayWayFactory payWayFactory;
@RequestMapping("/getPayWay")
public void getPayWay(@RequestParam String payWay)
{
WxPayObject wxpayObject =new WxPayObject();
payWayFactory.getPayWayService(payWay).pay(wxpayObject);
}
}
输入 payway分别输入wx和member输出结果如下:
本文对策略模式进行了讲解,策略模式在实际开发过程中应用的比较广泛,所以大家还是需要熟练的掌握其用法,如有疑问,请随时反馈。
留言与评论(共有 0 条评论) “” |