提出需求
现在要完成一个积分兑换礼品的功能,这个功能包含三个子系统,分别是资格校验(校验积分是否满足,库存是否足够等逻辑)、积分支付(扣减积分等逻辑操作)和物流对接子系统(对接物流信息,返回订单号)
需求分析
已知礼品兑换这个功能需要调用三个子系统的服务,对于客户端来说,并不在乎具体的实现细节。根据外观模式的定义:
外观模式又叫门面模式,提供了一个统一的接口,用来访问子系统中的一群接口,外观模式定义了一个高层接口,让子系统更加容易使用
显然我门可以使用外观模式来对三个子系统提供的接口进行封装,达到我们的需求。
代码实现
-
1.结构预览
image.png
依次是礼品实体定义,礼品兑换外观服务,支付服务,校验服务,物流系统服务以及测试类。
- 2.具体代码
Gift
/**
* @Author: ming.wang
* @Date: 2019/2/22 15:38
* @Description:
*/
@Getter
@Setter
public class Gift {
private String name;
}
GiftExchangeFacadeService
/**
* @Author: ming.wang
* @Date: 2019/2/22 15:46
* @Description:
*/
public class GiftExchangeFacadeService {
private QualifyService qualifyService=new QualifyService();//真实项目中一般是Spring注入或者使用feignClient调用其他的服务
private PaymentService paymentService=new PaymentService();
private ShippingService shippingService=new ShippingService();
public void giftExchange(Gift gift){
//资格校验通过
if (qualifyService.isAvaliable(gift))
{
//支付系统完成
if (paymentService.pay(gift))
{
String orderNo = shippingService.shipGift(gift);//获取订单号
System.out.println("物流系统下单成功,订单号是:"+orderNo);
}
}
}
}
PaymentService
/**
* @Author: ming.wang
* @Date: 2019/2/22 15:41
* @Description:
*/
public class PaymentService {
public boolean pay(Gift gift){
System.out.println("礼品"+gift.getName()+"积分支付成功(包括扣减积分等操作)");
return true;
}
}
QualifyService
/**
* @Author: ming.wang
* @Date: 2019/2/22 15:38
* @Description:
*/
public class QualifyService {
public boolean isAvaliable(Gift gift){
System.out.println("礼品"+gift.getName()+"资格校验通过(积分是否足够,库存是否足够等等)");
return true;
}
}
ShippingService
/**
* @Author: ming.wang
* @Date: 2019/2/22 15:44
* @Description:
*/
public class ShippingService {
public String shipGift(Gift gift){
//物流系统对接逻辑
System.out.println(gift.getName()+":进入物流系统");
return "666";//订单号
}
}
Test
/**
* @Author: ming.wang
* @Date: 2019/2/22 15:35
* @Description:
*/
public class Test {
public static void main(String[] args) {
Gift gift=new Gift();
gift.setName("T恤");
GiftExchangeFacadeService giftExchangeFacadeService=new GiftExchangeFacadeService();
giftExchangeFacadeService.giftExchange(gift);
}
}
外观模式的优点
- 简化了调用过程,无需深入了解子系统,防止带来风险
- 减少系统依赖,松散耦合
- 更好的划分访问层次
- 符合迪米特法则, 即最少知道原则
网友评论