一、 模版方法(Template Method)模式
用意:准备一个抽象类,将部分逻辑以具体方法以及具体构造子的形式实现,然后声明一些抽象方法来迫使子类实现剩余逻辑。不同的子类可以以不同的方式实现这些抽象方法,从而对剩余的逻辑有不同的实现。模版方法模式是基于继承的代码复用的基本技术。
模版方法模式与策略模式的区别:策略模式使用委派的方法提供不同的算法行为,而模式方法模式使用继承的方法提供不同的算法行为。
其结构图如下:
顶级逻辑也就是算法调用具体函数的先后顺序,顶级逻辑在抽象模版类中实现,子类不可改变顶级逻辑。
二、 模版方法在java中的应用
HttpServlet技术
HttpServlet类提供一个service()方法,这个方法调用7个do方法中的一个或几个,完成对客户端调用的处理。完成对客户端调用的处理。这些do方法则要由具体HttpServlet类提供。在这里,service()方法便是模版方法,7个do方法便是基本方法。
三、 模版方法中的方法
模版方法中的方法可以分为两个类:模版方法(Template)和基本方法(Primitive)
模版方法:一个模版方法是定义在抽象类中的,把基本操作方法组合在一起形成一个总算法,这个模版方法一般会在抽象类中定义,并由子类不加以修改完成继承下来。
基本方法:可分为三种:抽象方法、具体方法、钩子方法。抽象方法:一个抽象方法由抽象类声明,由具体子类实现。具体方法:一个具体方法由抽象类声明并实现,而子类并不实现或置换。钩子方法:一个钩子方法由抽象类声明并实现,而子类加以扩展。通常抽象类给出的实现是一个空实现,作为方法的默认实现。
四、 Servlet技术
Servlet的两个库包:
1、 javax.Servlet:这个库包提供了普通Servlet模型。
2、 javax.Servlet.http:这个库包提供了HTTP和HTTPS的servlet模型。
普通的Servlet模型只是假定协议是建立在TCP/IP之上的,并没有对请求—回答的协议做出任何具体的假设,所有与HTTP和HTTPS有关的逻辑均在javax.Servlet.http库里面。
Servlet的主要的类
Servlet库中有三个类提供了主要的Servlet技术架构,这三个类是:Servlet接口、GenericServlet抽象类和HttpServlet类。Servlet接口声明了三个方法:init(),destroy(),service()方法。GenericServlet类提供了Servlet接口的默认实现,但是却留下了一个service()方法,这个方法仍然是一个抽象方法。任何具体的Servlet类均必须提供service()方法,以便提供必要的具体行为。HttpServlet类继承自GenericServlet。虽然它本身也是一个抽象类,但是它为所有行为包括Service方法和七个do方法都提供了默认实现。这七个do方法基本涵盖了HTTP协议的各种请求的种类。
HttpServlet的生命周期
Java的HttpServlet类必须在一个Servlet引擎所提供的容器环境里面运行,因此,它的生命周期是由容器环境管理的。
(1) 加载
Servlet容器可以同时创建一个或多个Servlet对象。这个过程可以在Servlet容器加载Servlet类时执行,或者在Servlet对象响应请求时执行,也可以在两者之间的任何时间执行。
(2) 初始化
Servlet容器调用一个Servlet的init()方法将此Servlet初始化。初始化时,Servlet对象可以从数据库里读取初始数据,建立JDBC Connection,或者建立对其他有价值的资源的引用等。
(3) 就绪
Servlet被初始化以后,处于能响应请求的就绪状态。当客户端有一个请求时,Servlet容器将ServletRequest和ServletResponse对象都转发给Servlet,这两个对象以参数的形式传给service()方法。这样service()方法会进一步调用doGet()和doPost()等方法处理相应的HTTP请求。
(4) 释放和湮灭
调用destroy()方法,系统将释放相应的资源,所有失去引用的java对象都会被垃圾收集器收集。
模版方法的使用:
Service()方法是一个模版方法,service()方法会调用七个do方法中的一个或几个,完成对客户端调用的响应。这些do方法需要由HttpServlet的具体子类提供。
观察者模式应用:
Servlet引擎的事件可以分成Servlet环境事件和Session事件两种。通过Servlet引擎的事件机制可以做如下的工作:
(1)管理数据库和各种资源的使用和释放。(2)建立计数机制(3)监视HTTPSession的状态及属性。
当Servlet环境被创建、关闭,或者一个属性被加入到环境里、一个已经在环境里的属性被删除或者修改时,都会产生Servlet环境事件。如下表所示:
当Session被激活、钝化,或者一个属性被加入到Session对象里、一个已经在Session里的属性被删除或者修改时,都会产生Session事件。如下表所示:
要对某一个事件做出响应,就必须准备一个所谓的监听器类,这个类实际上扮演的就是观察者模式的角色。可按下列步骤准备一个监听器类:
(1) 针对某一个事件的监听类必须实现上面所给出的对应于这个事件的接口。
(2) 一个监听器类必须有一个公开的默认构造子(没有参量的构造子)。
(3) 必须实现监听器接口所要求的方法。