1、缺省适配器模式

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

image.png

  1. - A类去继承(extendsAdapter

image.png

2、关于设计模式

image.png

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();
}

} ```