java设计模式7.策略模式模板方法模式观察者模式
Posted Essay
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java设计模式7.策略模式模板方法模式观察者模式相关的知识,希望对你有一定的参考价值。
- 策略模式
策略模式的用意,将每一个算法封装到具有共同接口的独立的类中,从而使得它们可以相互替换。策略模式使得算法可以在不影响到客户端的情况下发生变化。
- 环境角色:持有一个抽象策略角色的引用。
- 抽象策略角色:给出所有的具体策略类所要实现的接口。
- 具体策略角色:包装相关的算法或行为。
- 模板方法模式
模板方法的用意,使用一个抽象类,将部分逻辑以具体方法以及具体构造子的形式实现,然后声明一些抽象方法来迫使子类实现剩余的逻辑。不同的子类可以用不同的方式来实现这些抽象方法。
- 抽象模板角色:1. 定义一个或多个抽象操作,以便让子类实现。这些操作叫做基本操作,它们是一个顶级逻辑的组成步骤。2. 定义一个模板方法,给出一个顶级逻辑的骨架,逻辑的组成步骤在对应的抽象操作中,推迟到子类中实现。
- 具体模板角色:实现父类定义的所有抽象方法,它们是一个顶级逻辑的组成步骤。
- 观察者模式
观察者模式又叫监听模式或者发布-订阅模式,它定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。这个主题对象在状态上发生变化时,会通知所有观察者对象(主题对象中会维护一个观察者对象的集合),使它们能够自动更新自己。
- 抽象被观察角色:主题角色把所有对观察者对象的引用保存在一个聚集中,另外提供接口,以便增加和删除观察者对象。
- 抽象观察者角色:为所有的具体观察者定义一个接口,在得到主题通知时更新自己。
- 具体被观察角色:将有关状态存入具体观察者对象,在具体主题状态改变时,给所有观察者发出通知。
- 具体观察者角色:实现抽象观察者要求的接口。
- 示例:servlet
Java的Servlet提供了J2EE技术的Web构建的基础,它提供了Servlet、JSP和EJB等架构。所有的Servlet必须遵循Java Servlet API,这个API由两个库及一系列类组成:
- javax.Servlet:提供普通的Servlet模型。
- javax.Servlet.http:提供HTTP和HTTPS的Servlet模型。
普通Servlet模型只是假定协议是建立在TCP/IP之上的,并没有对请求-回答的协议作出任何具体的假设,所有与HTTP和HTTPS有关的逻辑均在javax.Servlet.http库中,这种办法可以在最大程度上把可能发生变化的部分与一般性逻辑分开。
Servlet库中有三个类提供了Servlet主要的技术架构,分别是Servlet接口、GenericServlet类和HttpServlet类。
- Servlet接口声明了三个方法:init();destory(); 以及service();这三个方法决定了Servlet的生命周期。
- GenericServlet是一个抽象类:它提供了Servlet接口的默认实现,但是留下了一个service()方法由具体的Servlet类实现。
- HttpServlet继承自GenericServlet,本身也是抽象类,但是它为所有方法提供了默认实现,包括service();doGet();doHead();doPost();doPut();doDelete();doOption();doTracle()。
Servlet的生命周期由接口javax.Servlet.Servlet所定义,所有的Servlet必须在一个Servlet引擎所提供的容器环境里运行,因此必须直接或间接地实现Servlet接口,才能在Servlet容器环境里运行,并且由容器管理它的生命周期:加载-初始化-就绪-销毁。
模板方法模式的应用:HttpServlet的service()方法。
观察者模式的应用:
Servlet引擎的事件可以分成Servlet环境事件和Session事件,通过Servlet引擎的事件机制可以做如下工作:
- 管理数据库和各种资源的使用及释放。
- 建立计数机制。
- 监听HTTP Session的状态及属性。
Servlet环境事件:
Session事件:
上述两种事件机制涉及到4个监听器接口,它们都是java.util.EventListener(标记接口)的子接口。web容器在启动时会初始化一个全局对象ServletContext时,ServletContext提供add和remove接口来管理Listener。所以当上下文环境发生变化时,可以通知所有的Listener作出相应的动作。
#笔记内容参考《java与模式》
以上是关于java设计模式7.策略模式模板方法模式观察者模式的主要内容,如果未能解决你的问题,请参考以下文章