前言
即使在没有学习过设计模式之前,只要是写过代码,都会在不经意间使用到外观模式,或者说用到了外观模式的思想。
外观模式的定义:通过创建一个统一的高层接口,使得复杂的子系统更加容易使用。这个模式为复杂的系统提供一个简化的接口,隐藏系统的复杂性,并使得客户端代码与子系统之间的交互更加容易进行。
外观模式在实际中的运用:
- 封装细节,对外提供简单接口,使得调用者无需关心具体实现。
- 封装对象,隐藏对象方法,保证对象方法安全。
实战代码
封装细节
封装细节,在我们日常开发中很常见,就不贴示例代码了。
例如 项目中的各种工具类,一个方法行数太长拆分成多个小方法,mvc三层架构的service层,dao层 等等,广义上都可以看作是外观模式运用。
封装对象
在《How tomcat work》这本书中
tomcat 中的 HttpRequestFacade 和 HttpResponseFacade 这两个类就是封装对象的具体实现
以 HttpRequestFacade 类为例
HttpRequestFacade 类和 HttpRequestImpl 类都实现了 HttpServletRequest 接口
HttpRequestFacade 是用来封装 HttpRequestImpl 对象的。将 HttpRequestImpl 包装成 HttpRequestFacade 对象后,再交给 servlet 的 service 方法处理。这样做是为了保证 HttpRequestImpl 中方法的安全性
servlet 的 service 方法接收的入参是 HttpServletRequest 类型,从设计上讲,service 方法就只能调用 HttpServletRequest 中的方法,如果 HttpRequestImpl 没有经过包装直接传给了 service 方法,那么在 service 方法中,可以直接通过强制向下转型,从而拿到 HttpRequestImpl 对象,就能够访问 HttpRequestImpl 中的其他方法了
而如果用 HttpRequestFacade 包装后,在外观类里,只提供 HttpServletRequest 的方法实现,这样即使在 service 方法中直接通过强制向下转型拿到外观类,那也只能访问到 HttpServletRequest 的方法,这样就保证了 HttpRequestImpl 中方法的安全