从上面的一步步分析可以看出:其实架构的设计就是一系列相关的抽象。
先是抽象出 HTTP 服务,用来通信和解析协议。
再因为业务的复杂,为了不和 HTTP 服务耦合又抽象了一层 Servlet。
由 Servlet 加载和管理 Servlet ,来控制请求转发到指定的 Servlet 实现类。
然后我们安心的开发业务即可。
因为抽象所以灵活易扩展,比如现在是 HTTP1.1 服务,可以换成 HTTP 2。
现在用 Tomcat 来作为 Servlet 容器,也可以换成 Jetty。
现在用原生的实现 Servlet 来做业务,也可以换成 SpringMVC。
随意变更,因为都抽象出来了,就很好替换,只要遵循约定的接口实现即可。
框架设计的一个套路
看完了架构设计的套路,再说说框架套路。
接口和抽象类。
所有中间件设计必用的套路,当然我们自己的代码也会这样用。
先定义一个接口来约定一些动作,能做啥做啥。
然后再定义一个抽象类来实现这个接口,用来实现一些通用的逻辑,做到代码的复用。
然后再搞一些常用的实现类继承抽象类,方便开发者的使用。
剩下的就留给开发者自行扩展即可。
然后抽象类都会使用模板方法,也就是定义执行的流程,具体实现逻辑由子类自行实现。
这就是必用的套路。
接口约束、抽象类代码复用、实现常用实现类方便使用、剩下的自行扩展。
拿 Servlet 举例,首先定义 Servlet 接口。
public interface Servlet { void init(ServletConfig config) throws ServletException; ServletConfig getServletConfig(); void service(ServletRequest req, ServletResponse res)throws ServletException, IOException; String getServletInfo(); void destroy(); }
然后搞了个通用抽象类 GenericServlet,不过这个抽象类逻辑比较简单。
public abstract class GenericServlet implements Servlet, ServletConfig, java.io.Serializable { ................省略一些............. @Override public ServletConfig getServletConfig() { return config; } @Override public ServletContext getServletContext() { return getServletConfig().getServletContext(); } @Override public void init(ServletConfig config) throws ServletException { this.config = config; this.init(); } ................省略一些..................... }
然后搞了个常用的 HttpServlet 继承了 GenericServlet。
public abstract class HttpServlet extends GenericServlet { private static final long serialVersionUID = 1L; private static final String METHOD_DELETE = "DELETE"; private static final String METHOD_HEAD = "HEAD"; private static final String METHOD_GET = "GET"; .................... }
套路就是这么个套路,之后面试官问你接口和抽象类的问题,相信你也能答出来了。
最后
套路大家应该都 GET 到了。
想必大家都听过“计算机科学中的每个问题都可以用一间接层解决”。
是的,基本上所有问题抽象一层都能解决。
如果一层不够,那就两层。
欢迎加我好友进行深入地交流,备注「进群」,拉你进交流&内推群。
平日的面试题遇到难处,或者看某个知识点翻遍全网的资料还是感觉很模糊、不透彻,可以私聊我,给我留言。
遇到合适的我会整理写出一篇文章,我不会的去请教别人也给整出来。
那种工作遇到很细节的场景的还是别了,这种问你上司比较合适:)
巨人的肩膀
《深入拆解Tomcat & Jetty》 李号双