zoukankan      html  css  js  c++  java
  • 外观模式

    外观模式

    外观模式是对象的结构模式,外部与子系统的通信必须通过一个统一的外观对象进行。外观模式是一个高层次的接口,使得子系统更易于使用。

    医院的例子

    现代的软件系统都是比较复杂的。假如把医院比作一个子系统,按照部门职能,这个系统划分为挂号、门诊、划价、化验、收费、取药等。看病的人要与这些部门打交道,就如同一个子系统的客户端与一个子系统的各个类打交道一样,不是一件容易的事。

    解决这种不便的方法便是引入外观模式,医院可以设置一个接待员的位置,由接待员负责代为挂号、划价、缴费、取药等。病人只需要接触接待员,由接待员与各个部门打交道。

    外观模式的结构

    外观模式的结构可以这么表示:

    这个图中,体现了两种角色:

    1、外观角色

    客户端调用这个角色的方法。此角色知晓相关的子系统的功能和责任,正常情况下,本角色会将所有从客户端发来的请求委派到响应的子系统中

    2、子系统角色

    可以同时有一个或多个子系统,每个子系统都不是一个单独的类,而是一个类的集合。每个子系统都可以被客户端直接调用,或者被外观角色直接调用。子系统并不知道外观角色的存在,对于子系统而言,外观仅仅是另外一个客户端而已

    外观模式实例

    三个子模块

    1 public class ModuleA {
    2 
    3     public void testA(){
    4         System.out.println("ModuleA testA");
    5     }
    6 }
    1 public class ModuleB {
    2     public void testB(){
    3         System.out.println("ModuleB testB");
    4     }
    5 }
    1 public class ModuleC {
    2     public void testC(){
    3         System.out.println("ModuleC testC");
    4     }
    5

    外观对象

     1 public class Facade {
     2 
     3     public void test(){
     4         ModuleA moduleA = new ModuleA();
     5         moduleA.testA();
     6         ModuleB moduleB = new ModuleB();
     7         moduleB.testB();
     8         ModuleC moduleC = new ModuleC();
     9         moduleC.testC();
    10     }
    11     
    12

    main

    1 public static void main(String[] args) {
    2         Facade facade = new Facade();
    3         facade.test();
    4     }

    结果

    ModuleA testA
    ModuleB testB
    ModuleC testC

    客户端不需要亲自调用子系统的ABC模块了,也不需要知道内部系统的实现细节,只需要和Facade类交互就好了。这样可以有效的屏蔽内部的细节。

    外观模式在Java中的应用及解读

    Tomcat中有很多场景都使用到了外观模式,因为Tomcat中有很多不同的组件,每个组件需要相互通信,但又不能将自己内部数据过多地暴露给其他组件。用外观模式隔离数据是个很好的方法,比如Request上使用外观模式:

    比如Servlet,doGet和doPost方法,参数类型是接口HttpServletRequest和接口HttpServletResponse,那么Tomcat中传递过来的真实类型到底是什么呢?

    有过对Java Web项目Debug经验的肯定会发现,在真正调用Servlet前,会经过很多Tomcat方法。反编译一下javaee.jar包就会看到,传递给Tomcat的request和response的真正类型是:

    看到返回的都是一个Facade类。因为Request类中很多方法都是组件内部之间交互用的,比如setComet、setReuqestedSessionId等方法,这些方法并不对外公开,但又必须设置为public,因为还要和内部组件交互使用。最好的解决方法就是通过使用一个Facade类,屏蔽掉内部组件之间交互的方法,只提供外部程序要使用的方法。

    如果不使用Facade,直接传递的是HttpServletRequest和HttpServletResponse,那么熟悉容器内部运作的开发者可以分别把ServletRequest和ServletResponse向下转型为HttpServletRequest和HttpServletResponse,这样就有安全性的问题了。

    外观模式的优点

    1.松耦合

    松了客户端和子系统的耦合关系,让子系统内部的模块能更容易扩展和维护。

    2.简单易用

    客户端不需要了解内部的实现,也不需要和众多子系统内部的模块交互,只需要和外观类交互就可以了。

    3.更好的划分层次

    通过合理使用facade,可以帮助我们更好的划分层次。有些方法是系统对内的,有的是对外的,把需要暴露给外部的功能集中到Facade中,这样既方便客户端调用,也可以更好的隐藏内部的细节。

  • 相关阅读:
    博客作业04--树
    博客作业03--栈和队列
    博客作业2---线性表
    博客作业01-抽象数据类型
    C语言最后一次作业--总结报告
    CSAPP(8):系统级IO
    CSAPP(7):虚拟存储器
    CSAPP(6):异常控制流
    CASPP(5):链接
    CSAPP(4):存储器层次结构
  • 原文地址:https://www.cnblogs.com/tp123/p/6503354.html
Copyright © 2011-2022 走看看