• 策略模式

策略模式的用意,将每一个算法封装到具有共同接口的独立的类中,从而使得它们可以相互替换。策略模式使得算法可以在不影响到客户端的情况下发生变化。

  • 环境角色:持有一个抽象策略角色的引用。
  • 抽象策略角色:给出所有的具体策略类所要实现的接口。
  • 具体策略角色:包装相关的算法或行为。
  • 模板方法模式

模板方法的用意,使用一个抽象类,将部分逻辑以具体方法以及具体构造子的形式实现,然后声明一些抽象方法来迫使子类实现剩余的逻辑。不同的子类可以用不同的方式来实现这些抽象方法。

  • 抽象模板角色: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.策略模式、模板方法模式、观察者模式的更多相关文章

  1. Java设计模式菜鸟系列(十)模板方法模式建模与实现

    转载请注明出处:http://blog.csdn.net/lhy_ycu/article/details/39806973 模板方法模式(Template Method):在一个方法中定义了一个算法的 ...

  2. Java设计模式(22)命令模式(Command模式)

    Command模式是最让我疑惑的一个模式,我在阅读了很多代码后,才感觉隐约掌握其大概原理,我认为理解设计模式最主要是掌握起原理构造,这样才对自己实际编程有指导作用.Command模式实际上不是个很具体 ...

  3. Java设计模式(21)访问模式(Visitor者模式)

    Visitor定义:作用于某个对象群中各个对象的操作.它可以使你在不改变这些对象本身的情况下,定义作用于这些对象的新操作. 在Java中,Visitor模式实际上是分离了collection结构中的元 ...

  4. Java设计模式(19)状态模式(State模式)

    State的定义:不同的状态,不同的行为:或者说,每个状态有着相应的行为. 何时使用状态模式 State模式在实际使用中比较多,适合"状态的切换".因为我们经常会使用If else ...

  5. Java设计模式(17)解释器模式(Interpreter模式)

    Interpreter定义:定义语言的文法,并且建立一个解释器来解释该语言中的句子. Interpreter似乎使用面不是很广,它描述了一个语言解释器是如何构成的,在实际应用中,我们可能很少去构造一个 ...

  6. Java设计模式(16)中介模式(Mediator模式)

    Mediator定义:用一个中介对象来封装一系列关于对象交互行为. 为何使用Mediator模式/中介模式 各个对象之间的交互操作非常多,每个对象的行为操作都依赖彼此对方,修改一个对象的行为,同时会涉 ...

  7. Java设计模式(15)备忘录模式(Memento模式)

    Memento定义:memento是一个保存另外一个对象内部状态拷贝的对象,这样以后就可以将该对象恢复到原先保存的状态. Memento模式相对也比较好理解,我们看下列代码: public class ...

  8. Java设计模式(13)模板模式(Template模式)

    Template模式定义:定义一个操作中算法的骨架,将一些步骤的执行延迟到其子类中. 其实Java的抽象类本来就是Template模式,因此使用很普遍.而且很容易理解和使用,我们直接以示例开始: pu ...

  9. Java设计模式(12)迭代模式(Iterator模式)

    上了这么多年学,我发现一个问题,好象老师都很喜欢点名,甚至点名都成了某些老师的嗜好,一日不点名,就饭吃不香,觉睡不好似的,我就觉得很奇怪,你的课要是讲的好,同学又怎么会不来听课呢,殊不知:“误人子弟, ...

  10. Java设计模式(11)外观模式(Facade模式)

    外观模式(Facade)的定义:为子系统中的一组接口提供一个一致的界面. Facade一个典型应用就是数据库JDBC的应用,如下例对数据库的操作: public class DBCompare { C ...

随机推荐

  1. 深入理解Java中的锁(三)

    ReadWriteLock接口 读写锁维护一对关联锁,一个只用于读操作,一个只用于写操作.读锁可以由多个线程同时持有,又称共享锁.写锁同一时间只能由一个线程持有,又称互斥锁.同一时间,两把锁不能被不同 ...

  2. python中if __name__ == '__main__' :main(()

    例如: if __name__ == '__main__': main() 如果运行的是主函数的话,执行下一句main() 如果作为模块被其他文件导入使用的话,我们就不执行后面的main()什么的. ...

  3. 微信小程序onLoad与onShow的区别

    现在招聘网站上,会小程序开发都可以找到月薪不错的职位了,可见小程序认可度还是可以的! 小程序声明周期onLoad与onShow的区别? onLoad页面加载时调用,可以获取参数,通过options. ...

  4. StringBuffer类的delete()方法和deleteCharAt()方法的区别

    引言 StringBuffer类的delete()方法和deleteCharAt()方法都是用来删除StringBuffer字符串中的字符 区别 1.对于delete(int start,int en ...

  5. oracle一条语句插入多个值的方法

    今天在实践过程中遇到一个问题, 我想往数据库插入多条数据时,使用了如下语句: insert into 表1 (字段1,字段2) values (1,2),(2,3),(3,4); 这条语句在mysql ...

  6. 【iOS】The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods install

    从 github 下载的项目经常会遇到这个问题, 如图所示: 参考: iOS 'The sandbox is not sync with the Podfile.lock'问题解决 尚未解决…………

  7. Nginx安装(详细版本)

    Nginx安装文档 前言: 最近,系统部署人员那边,让我们给写一个傻瓜式的Nginx安装过程.所以就有了这个文档,本着独乐乐不如众乐乐,就分享一下.我觉得对入门小白来说,有图,乃至运行过程图,是很重要 ...

  8. BGP属性控制实验

    目录 实验拓扑 实验需求 实验步骤 个人小结: 实验拓扑 实验需求 更改BGP路由的属性让R4访问R1优先选R2这条路 实验步骤 1. 按照图示配置IP地址及环回口地址 R1 [R1]int g0/0 ...

  9. Nginx配置安装(Mac)

    我用到的安装工具是:homebrew 真的很方便! 步骤1: 打开终端,输入 brew info nginx结果:我们可以看到,nginx在本地还未安装(Not installed),nginx的来源 ...

  10. 【Python-Django后端开发】配置静态文件详解!!!

    配置前端静态文件 1. 准备静态文件 2. 指定静态文件加载路径 STATIC_URL = '/static/' # 配置静态文件加载路径 STATICFILES_DIRS = [os.path.jo ...