适配器设计模式
将一个对象包装成另外一种类型的对象,意义何在?
举个例子说明下:EL表达式是从PageContext、HttpServletRequestWrapper、HttpServletSessionWrapper、ServletContext 中获取指定属性的值。现在希望如果无法从 PageContext 和 HttpServletRequestWrapper 取到指定属性的值,则去 ValueStack 对象获取,那么怎么办?
可以定义一个包装类 Struts,那么构造包装类对象的时候将 HttpServletSessionWrapper 对象作为参数传入构造器中,将HttpServletSessionWrapper 对象包装在里面。包装类可以去覆盖重写 HttpServletSessionWrapper 的getAttribute 方法,这个方法中可以先去调用 HttpServletSessionWrapper 对象的 getAttribute 方法,如果获取不到想要的结果,则再去 ValueStack 对象中获取。
public class StrutsRequestWrapper extends HttpServletRequestWrapper {
private HttpServletRequestWrapper request;
public StrutsRequestWrapper(HttpServletRequestWrapper request) {
this.request = request;
}
// 重写getAttribute 方法
public Object getAttribute(String name){
Object obj = this.request.getAttribute(name);
if(obj == null){
// 如果为空,则再去 ValueStack 对象中查找
}
}
}
适用场景:当需要照常访问原来的对象,并且又希望扩展某个方法的功能时可以使用该设计模式