【设计模式-门面模式】

时间:2022-07-24
本文章向大家介绍【设计模式-门面模式】,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

学校的学生信息相关系统大家都用过,比如门户网、教务系统、图书管理系统等,一般需要用到某个系统,需要单独去登录,比如同时想去门户网和教务系统查询信息,需要在两个网站都进行登录。此时需要有一个统一用户管理系统,登录了此系统之后,想看其他网站就无需再次登录,这就是门面模式的例子。

门面模式属于结构型模式。类似与在平时给前端提供一个接口,接口里面调用了很多其他的服务。

一、定义

定义了一个高层接口,包含了对各个子系统的引用,客户端可以通过它访问各个子系统的功能。

二、实例

比如去购物网站下单的时候,会涉及到订单服务、支付服务、物流服务。购物网站提供了一个下单接口,在此接口内会调用这三个服务。

商品对象:

public class Produce {
    private String name;
    public Produce(String name) {
        this.name = name;
    }   
    //省略get/set
}

订单服务:

public class OrderService {
    public boolean submitOrder(Produce produce){
        System.out.println("提交购买:"+produce.getName()+"的订单信息");
        return true;
    }
}

支付服务:

public class PayService {
    public boolean payOrder(Produce produce){
        System.out.println("支付购买:"+produce.getName());
        return true;
    }
}

物流服务:

public class LogisticsService {
    public String getLogisticsNo(){
        String orderNO = UUID.randomUUID().toString();
        System.out.println("调用订单服务,获取订单号:"+orderNO);
        return orderNO;
    }
}

购物商城:提供了一个统一接口去访问这些服务

public class Mall{
    private OrderService orderService = new OrderService();
    private PayService payService = new PayService();
    private LogisticsService logisticsService = new LogisticsService();
    
    1、提供了一个统一接口 
    public void buyProduce(Produce produce){
        orderService.submitOrder(produce);
        payService.payOrder(produce);
        logisticsService.getLogisticsNo();
    }

}

测试类(客户端):

public static void main(String[] args) {
        Produce produce = new Produce("机械键盘");
        Mall mall = new Mall();
        mall.buyProduce(produce);
    }

结果:

类图:

三、源码实例

SpringMVC从页面发起请求到后台处理的过程。最重要的就是DispatchServlet的doDispatch方法。

先从HandlerMapping获取对应的Handler,然后获取HandlerAdapter,最终处理得到ModerAndView返回视图。