public interface MyInterface {
void m1();
void m2();
void m3();
void m4();
void m5();
void core();
}
接口中的方法并不是全部都需要,那么避免代码冗余,就可以使用抽象类实现接口,作为适配器
public abstract class UserAdapter implements MyInterface{
@Override
public void m1() {
}
@Override
public void m2() {
}
@Override
public void m3() {
}
@Override
public void m4() {
}
@Override
public void m5() {
}
@Override
public abstract void core();
}
把最常用的方法作为抽象方法,那么之后的类继承这个适配器抽象类,实现适配器的抽象方法即可,不需要实现接口的其他方法
public class UserService extends UserAdapter{
@Override
public void core() {
}
}
改造Servlet,创建一个抽象类,实现Servlet接口,作为适配器,把需要经常使用的方法进行抽象
public abstract class ServletAdapter implements Servlet {
@Override
public abstract void init(ServletConfig servletConfig) throws ServletException;
@Override
public ServletConfig getServletConfig() {
return null;
}
@Override
public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException;
@Override
public String getServletInfo() {
return null;
}
@Override
public void destroy();
}
最后继承抽象类的Servlet代码会变的更简洁
public class AServlet extends ServletAdapter {
@Override
public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
}
}
但问题仍然存在,如果此时需要ServletConfig,那就不行了,进一步解决方案,创建成员变量
此时之前的AServlet类,可以通过this.getServletConfig()获取servletConfig
但仍然存在问题,如果需要重写init方法,但是又没法规范程序员严格编写,保证servletConfig获取正常,这时就需要在适配器中,把它final了,再写个init方法,让程序员去调用这个方法,保证了既要又要。
改造完成,不过这就是官方提供的GenericServlet,不信?可以查看
实现了Servlet接口,定义了成员变量
获取了config,调用了另一个init方法,这就是GenericServlet的实现过程