美文网首页
外观模式的应用

外观模式的应用

作者: 谜00016 | 来源:发表于2019-02-23 12:25 被阅读15次

    提出需求

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

    需求分析

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

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

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

    代码实现

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

    外观模式的优点

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

    相关文章

      网友评论

          本文标题:外观模式的应用

          本文链接:https://www.haomeiwen.com/subject/topeyqtx.html