门面模式在Tomcat中有多处使用,在Request和Response对象封装,从ApplicationContext到ServletContext封装中都用到了这种设计模式。html
在门面模式中,一般只须要一个门面类,而且此门面类只有一个实例,换言之它是一个单例类。固然这并不意味着在整个系统里只有一个门面类,而仅仅是说对每个子系统只有一个门面类。或者说,若是一个系统有好几个子系统的话,每个子系统都有一个门面类,整个系统能够有数个门面类。java
初学者每每觉得经过继承一个门面类即可在子系统中加入新的行为,这是错误的。门面模式的用意是为子系统提供一个集中化和简化的沟通管道,而不能向子系统加入新的行为。好比医院中的接待员并非医护人员,接待员并不能为病人提供医疗服务。程序员
门面模式的优势:web
● 松散耦合设计模式
门面模式松散了客户端与子系统的耦合关系,让子系统内部的模块能更容易扩展和维护。安全
● 简单易用设计
门面模式让子系统更加易用,客户端再也不须要了解子系统内部的实现,也不须要跟众多子系统内部的模块进行交互,只须要跟门面类交互就能够了。xml
● 更好的划分访问层次htm
经过合理使用Facade,能够帮助咱们更好地划分访问的层次。有些方法是对系统外的,有些方法是系统内部使用的。把须要暴露给外部的功能集中到门面中,这样既方便客户端使用,也很好地隐藏了内部的细节。对象
Tomcat中门面模式使用的不少,由于Tomcat中有不少不一样组件,每一个组件要相互通讯,可是又不能将本身内部数据过多的暴露给其余组件。用门面模式隔离数据是个很好的方法。
下面是Request上使用的门面模式:
使用过Servlet的人都清楚,除了要在web.xml作相应的配置外,还需继承一个叫HttpServlet的抽象类,而且重写doGet与doPost方法(固然只重写service方法也是能够的)。
Request对象中的不少方法都是内部组件之间相互交互时使用的,好比setComet、setRequestedSessionId等方法(这里就不一一列举了)。这些方法并不对外部公开,可是又必须设置为public,由于还须要跟内部组件之间交互使用。最好的解决方法就是经过使用一个Facade类,将与内部组件之间交互使用的方法屏蔽掉,只提供给外部程序感兴趣的方法。
若是不使用Facade类,直接传递的是Request对象和Response对象,那么熟悉容器内部运做的程序员能够分别把ServletRequest和ServletResponse对象向下转换为Request和Response,并调用它们的公共方法。好比拥有Request对象,就能够调用setComet、setRequestedSessionId等方法,这会危害安全性。
原文连接 http://www.cnblogs.com/java-my-life/archive/2012/05/02/2478101.html