1、缺省适配器模式
- 不适用缺省适配器模式的缺点
- 假设存在一个接口CommonIn,其中有9个方法,现在有一个类A直接去实现(implements)这个接口,但是A只需要接口中的3个方法,由于A是直接实现了这个接口,所以会有6个方法是空实现,代码十分丑陋。如何解决这个问题,使得代码更加优雅?方法就是使用缺省适配器模式。
- 使用缺省适配器模式
- 创建一个类Adapter,让这个类去直接实现CommonIn接口,然后将A类中需要使用的方法都定义为抽象方法。

- 让A类去继承(extends)Adapter
2、关于设计模式
3、GenericServlet存在的意义?
- 其实GenericServlet就是充当了一个适配器类的角色,使得我们不需要直接去实现Servlet接口【因为这个接口中的许多方法可能是不需要的,直接实现会使得代码丑陋】,而是去继承该适配器类。
- 适配器除了可以使得代码优雅之外,还可以在适配器中提供大量的方法,子类继承之后,可以在子类中直接使用,方便编程。
- SUN公司已经为我们写好了该类,直接使用即可,以下为源码。 ```java package javax.servlet;
import java.io.IOException; import java.util.Enumeration;
public abstract class GenericServlet implements Servlet, ServletConfig, java.io.Serializable {
private static final long serialVersionUID = 1L;
private transient ServletConfig config;
public GenericServlet() {
}
@Override
public void destroy() {
}
@Override
public String getInitParameter(String name) {
return getServletConfig().getInitParameter(name);
}
@Override
public Enumeration<String> getInitParameterNames() {
return getServletConfig().getInitParameterNames();
}
@Override
public ServletConfig getServletConfig() {
return config;
}
@Override
public ServletContext getServletContext() {
return getServletConfig().getServletContext();
}
@Override
public String getServletInfo() {
return "";
}
@Override
public void init(ServletConfig config) throws ServletException {
this.config = config;
this.init();
}
public void init() throws ServletException {
//该空参init方法供子类需要进行重写
//如此设计的目的,若是子类需要重写init方法,就不用覆盖原来有参数的init方法而导致异常
//若是没有该方法,子类还是要重写init(ServletConfig config)方法的话,就必须在重写的init
//方法之中第一句话写上super.init(config),如此才能调用父类的init方法
//以此保证this.config = config
//而该无参init方法的存在就使得我们不需要再写super.init(config)
//因此,以后建议重写无参数的init方法
}
public void log(String msg) {
getServletContext().log(getServletName() + ": " + msg);
}
public void log(String message, Throwable t) {
getServletContext().log(getServletName() + ": " + message, t);
}
@Override
public abstract void service(ServletRequest req, ServletResponse res)
throws ServletException, IOException;
@Override
public String getServletName() {
return config.getServletName();
}
} ```
