外观模式的应用

提出需求

现在要完成一个积分兑换礼品的功能,这个功能包含三个子系统,分别是资格校验(校验积分是否满足,库存是否足够等逻辑)、积分支付(扣减积分等逻辑操作)和物流对接子系统(对接物流信息,返回订单号)

需求分析

已知礼品兑换这个功能需要调用三个子系统的服务,对于客户端来说,并不在乎具体的实现细节。根据外观模式的定义:

外观模式又叫门面模式,提供了一个统一的接口,用来访问子系统中的一群接口,外观模式定义了一个高层接口,让子系统更加容易使用

显然我门可以使用外观模式来对三个子系统提供的接口进行封装,达到我们的需求。

代码实现

  • 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);
    }
}

外观模式的优点

  • 简化了调用过程,无需深入了解子系统,防止带来风险
  • 减少系统依赖,松散耦合
  • 更好的划分访问层次
  • 符合迪米特法则, 即最少知道原则

你可能感兴趣的:(外观模式的应用)