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.策略模式、模板方法模式、观察者模式的更多相关文章
- Java设计模式菜鸟系列(十)模板方法模式建模与实现
转载请注明出处:http://blog.csdn.net/lhy_ycu/article/details/39806973 模板方法模式(Template Method):在一个方法中定义了一个算法的 ...
- Java设计模式(22)命令模式(Command模式)
Command模式是最让我疑惑的一个模式,我在阅读了很多代码后,才感觉隐约掌握其大概原理,我认为理解设计模式最主要是掌握起原理构造,这样才对自己实际编程有指导作用.Command模式实际上不是个很具体 ...
- Java设计模式(21)访问模式(Visitor者模式)
Visitor定义:作用于某个对象群中各个对象的操作.它可以使你在不改变这些对象本身的情况下,定义作用于这些对象的新操作. 在Java中,Visitor模式实际上是分离了collection结构中的元 ...
- Java设计模式(19)状态模式(State模式)
State的定义:不同的状态,不同的行为:或者说,每个状态有着相应的行为. 何时使用状态模式 State模式在实际使用中比较多,适合"状态的切换".因为我们经常会使用If else ...
- Java设计模式(17)解释器模式(Interpreter模式)
Interpreter定义:定义语言的文法,并且建立一个解释器来解释该语言中的句子. Interpreter似乎使用面不是很广,它描述了一个语言解释器是如何构成的,在实际应用中,我们可能很少去构造一个 ...
- Java设计模式(16)中介模式(Mediator模式)
Mediator定义:用一个中介对象来封装一系列关于对象交互行为. 为何使用Mediator模式/中介模式 各个对象之间的交互操作非常多,每个对象的行为操作都依赖彼此对方,修改一个对象的行为,同时会涉 ...
- Java设计模式(15)备忘录模式(Memento模式)
Memento定义:memento是一个保存另外一个对象内部状态拷贝的对象,这样以后就可以将该对象恢复到原先保存的状态. Memento模式相对也比较好理解,我们看下列代码: public class ...
- Java设计模式(13)模板模式(Template模式)
Template模式定义:定义一个操作中算法的骨架,将一些步骤的执行延迟到其子类中. 其实Java的抽象类本来就是Template模式,因此使用很普遍.而且很容易理解和使用,我们直接以示例开始: pu ...
- Java设计模式(12)迭代模式(Iterator模式)
上了这么多年学,我发现一个问题,好象老师都很喜欢点名,甚至点名都成了某些老师的嗜好,一日不点名,就饭吃不香,觉睡不好似的,我就觉得很奇怪,你的课要是讲的好,同学又怎么会不来听课呢,殊不知:“误人子弟, ...
- Java设计模式(11)外观模式(Facade模式)
外观模式(Facade)的定义:为子系统中的一组接口提供一个一致的界面. Facade一个典型应用就是数据库JDBC的应用,如下例对数据库的操作: public class DBCompare { C ...
随机推荐
- Could not load NIB in bundle: 'NSBundle.....
学习NSNotification时遇到了这个问题,错误日志如下: 2015-08-28 17:47:24.617 NSNotificationDemo[7158:786614] *** Termina ...
- 整理github总结
之前记述过两篇关于git命令的随笔,那时候对git的理解还不太深(虽然现在理解的也不是很多...菜哭了),只会用那些命令,并没有形成自己的知识,今天下载完Git之后,规整了一下自己的github,在吃 ...
- 读写properties文件
1. 读properties文件 Properties props = new Properties(); try { InputStream in = new FileInputStream(&qu ...
- 深入理解JVM-java字节码文件结构剖析(练习解读字节码)
public class MyTest2 { String str = "Welcome"; private int x = 5; public static Integer in ...
- python_Tensorflow学习(三):TensorFlow学习基础
一.矩阵的基本操作 import tensorflow as tf # 1.1矩阵操作 sess = tf.InteractiveSession() x = tf.ones([2, 3], &qu ...
- hdu1241 油田计数
具体思路:求联通块,在"@“的周围进行dfs,使用8个方向向量来代表搜索的方向 贴一下我的主要代码段: int dir[8][2]={{1,1},{-1,-1},{1,-1},{-1,1}, ...
- koa2图片上传成功后返回服务器地址,实时显示服务器图片
版本:node(8.5.0); koa(2.4.1); koa-router(7.3.0); koa-body(2.5.0); koa-static(4.0.2); 代码实现 const fs = r ...
- 递归&分治&贪心
递归 Recursion:通过函数体来进行的循环. 思路简单但效率低(建立函数的副本,消耗大量时间和内存).能用迭代就不用递归.递推公式+递推终止条件. 计算n阶乘,递归实现 def Factoria ...
- Streaming+Sparksql使用sql实时分析 rabbitmq+mongodb+hive
SparkConf sparkConf = new SparkConf()//此处使用一个链接切记使用一个链接否则汇报有多个sparkcontext错误 .setAppName("Spark ...
- 【KakaJSON手册】01_JSON转Model_01_基本用法
在iOS开发中,后台返回的数据大多是JSON格式,对应地会被网络框架层解析成Swift中的Dictionary.Array.由于数据类型的复杂.字段的繁多,直接使用Dictionary.Array会比 ...