在开发过程中使用一个接口并不需要使用这个接口中的所有方法,但是在语法的规定下又不得不使用,于是就需要使用缺省适配器设计模式,接下来就借助Servlet相关的例子来介绍一下这种设计模式
首先创建一个GenericServlet.java文件
//缺省适配器设计模式
public class GenericServlet implements Servlet,ServletConfig {
private ServletConfig config;
//模板方法设计模式
@Override
public void init(ServletConfig servletConfig) throws ServletException {
this.config = servletConfig;
}
@Override
public ServletConfig getServletConfig() {
return config;
}
@Override
public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException ;
@Override
public String getServletInfo() {
return null;
}
@Override
public void destroy() {
}
@Override
public String getInitParameter(String s) {
return config.getInitParameter(s);
}
@Override
public Enumeration<String> getInitParameterNames() {
return config.getInitParameterNames();
}
@Override
public ServletContext getServletContext() {
return config.getServletContext();
}
@Override
public String getServletName() {
return config.getServletName();
}
}
然后再类属性和想要使用的方法前面加上abstract
//缺省适配器设计模式
public abstract class GenericServlet implements Servlet,ServletConfig
//抽象方法,专门让子类来实现
@Override
public abstract void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException ;
再创建一个SomeServlet.java文件来继承这个类使用这个方法
public class SomeServlet extends GenericServlet {
@Override
public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
System.out.println("执行someServlet的service()方法");
String param = this.getInitParameter("company");
System.out.println(param);
String servletName = this.getServletName();
System.out.println(servletName);
}
这就是一个非常简单的缺省适配器设计模式了。当然原本就已经可以直接调用GenericServlet这个类。这里只是借用它做个介绍。
再顺便讲一下模板方法设计模式,因为在GenericServlet这个类中使用了这种方式
重写init(ServletConfig servletConfig)方法
public void init() {
}
并在原本的init方法中调用重写的方法
//模板方法设计模式
@Override
public void init(ServletConfig servletConfig) throws ServletException {
this.config = servletConfig;
//调用无参的init()方法
init();
System.out.println("----------------------");
}
再让我们来到SomeServlet.java文件当中,重写父类的无参init方法
//重写父类的无参init()方法
@Override
public void init() {
System.out.println("=====================");
}
在GenericServlet中定义的无参init方法的目的就是让子类去进行重写来达到对它们进行灵活的运用的目的。这就是一个很简单的模板方法设计模式。