当前位置: 首页 > news >正文

《java与模式》学习系列——模版方法模式

 

一、 模版方法(Template Method)模式

用意:准备一个抽象类,将部分逻辑以具体方法以及具体构造子的形式实现,然后声明一些抽象方法来迫使子类实现剩余逻辑。不同的子类可以以不同的方式实现这些抽象方法,从而对剩余的逻辑有不同的实现。模版方法模式是基于继承的代码复用的基本技术。

模版方法模式与策略模式的区别:策略模式使用委派的方法提供不同的算法行为,而模式方法模式使用继承的方法提供不同的算法行为。

其结构图如下:

顶级逻辑也就是算法调用具体函数的先后顺序,顶级逻辑在抽象模版类中实现,子类不可改变顶级逻辑。

二、 模版方法在java中的应用

HttpServlet技术

HttpServlet类提供一个service()方法,这个方法调用7do方法中的一个或几个,完成对客户端调用的处理。完成对客户端调用的处理。这些do方法则要由具体HttpServlet类提供。在这里,service()方法便是模版方法,7do方法便是基本方法。

三、 模版方法中的方法

模版方法中的方法可以分为两个类:模版方法(Template)和基本方法(Primitive)

模版方法:一个模版方法是定义在抽象类中的,把基本操作方法组合在一起形成一个总算法,这个模版方法一般会在抽象类中定义,并由子类不加以修改完成继承下来。

基本方法:可分为三种:抽象方法、具体方法、钩子方法。抽象方法:一个抽象方法由抽象类声明,由具体子类实现。具体方法:一个具体方法由抽象类声明并实现,而子类并不实现或置换。钩子方法:一个钩子方法由抽象类声明并实现,而子类加以扩展。通常抽象类给出的实现是一个空实现,作为方法的默认实现。

四、 Servlet技术

Servlet的两个库包

1、  javax.Servlet:这个库包提供了普通Servlet模型。

2、  javax.Servlet.http:这个库包提供了HTTPHTTPSservlet模型。

普通的Servlet模型只是假定协议是建立在TCP/IP之上的,并没有对请求—回答的协议做出任何具体的假设,所有与HTTPHTTPS有关的逻辑均在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的生命周期

JavaHttpServlet类必须在一个Servlet引擎所提供的容器环境里面运行,因此,它的生命周期是由容器环境管理的。

(1)       加载

 Servlet容器可以同时创建一个或多个Servlet对象。这个过程可以在Servlet容器加载Servlet类时执行,或者在Servlet对象响应请求时执行,也可以在两者之间的任何时间执行。

(2)       初始化

 Servlet容器调用一个Servletinit()方法将此Servlet初始化。初始化时,Servlet对象可以从数据库里读取初始数据,建立JDBC Connection,或者建立对其他有价值的资源的引用等。

(3)       就绪

Servlet被初始化以后,处于能响应请求的就绪状态。当客户端有一个请求时,Servlet容器将ServletRequestServletResponse对象都转发给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)       必须实现监听器接口所要求的方法。

 

 

相关文章:

  • 《java与模式》学习系列——备忘录模式
  • 向量加减法运算及其几何意义
  • 关于 Java 中 finally 语句块的深度辨析
  • Linux 基础(一)
  • Windows 7 应用程序exe图标丢失的修复
  • 算法导论学习笔记——堆排序
  • 让Docker容器使用静态独立的外部IP(便于集群组建)
  • 算法导论学习笔记——插入排序
  • 本地Git仓库与Github远程仓库同步
  • 算法导论学习笔记——合并排序
  • 算法导论学习笔记——最大优先级队列
  • Data.xml文件找不到的解决
  • 算法导论学习笔记——快速排序算法
  • instancetype
  • CentOS下SVN使用
  • 【跃迁之路】【585天】程序员高效学习方法论探索系列(实验阶段342-2018.09.13)...
  • CentOS6 编译安装 redis-3.2.3
  • Debian下无root权限使用Python访问Oracle
  • ES6语法详解(一)
  • Idea+maven+scala构建包并在spark on yarn 运行
  • Linux快速复制或删除大量小文件
  • PHP 使用 Swoole - TaskWorker 实现异步操作 Mysql
  • Python 反序列化安全问题(二)
  • UMLCHINA 首席专家潘加宇鼎力推荐
  • 大型网站性能监测、分析与优化常见问题QA
  • 二维平面内的碰撞检测【一】
  • 干货 | 以太坊Mist负责人教你建立无服务器应用
  • 简析gRPC client 连接管理
  • 前嗅ForeSpider采集配置界面介绍
  • 深入浏览器事件循环的本质
  • 通信类
  • 字符串匹配基础上
  • #pragma预处理命令
  • #stm32驱动外设模块总结w5500模块
  • (13)Latex:基于ΤΕΧ的自动排版系统——写论文必备
  • (k8s中)docker netty OOM问题记录
  • (更新)A股上市公司华证ESG评级得分稳健性校验ESG得分年均值中位数(2009-2023年.12)
  • (四)TensorRT | 基于 GPU 端的 Python 推理
  • **PHP二维数组遍历时同时赋值
  • .NET序列化 serializable,反序列化
  • .NET与java的MVC模式(2):struts2核心工作流程与原理
  • .sh文件怎么运行_创建优化的Go镜像文件以及踩过的坑
  • /boot 内存空间不够
  • :“Failed to access IIS metabase”解决方法
  • @Autowired 与@Resource的区别
  • @TableId注解详细介绍 mybaits 实体类主键注解
  • @Valid和@NotNull字段校验使用
  • [ JavaScript ] JSON方法
  • [2023年]-hadoop面试真题(一)
  • [Apio2012]dispatching 左偏树
  • [IDF]啥?
  • [Intel Edison开发板] 05、Edison开发基于MRAA实现IO控制,特别是UART通信
  • [Java][Android][Process] ProcessBuilder与Runtime差别
  • [leetcode]Search a 2D Matrix @ Python
  • [Linux打怪升级之路]-信号的保存和递达