《Java设计模式及实践》—3 行为型模式
第3章
行为型模式
本章介绍行为型模式。行为型模式关注对象交互、通信和控制流。大多数行为型模式都基于组合和委托而不是继承。我们将在本章中研究以下行为型模式:
责任链模式
命令模式
解释器模式
迭代器模式
观察者模式
中介者模式
备忘录模式
状态模式
策略模式
模板方法模式
空对象模式
访问者模式
3.1 责任链模式
计算机软件是用来处理信息的,有多种不同的方式来组织和处理信息。从前文了解到,当我们在讨论面向对象编程时,应该赋予一个类单一的职责,从而使得类容易维护和扩展。
设想一个场景,需要对一批从客户端来的数据进行多种不同的操作,我们会使用多个不同的类负责不同的操作,而不是使用一个类集成所有操作,这样做能让代码松耦合且简洁。
这些类被称为处理器,第一个处理器会接收请求,如果它需要执行操作则会进行一次调用,如果不需要则会将请求传递给第二个处理器。类似地,第二个处理器确认并将请求传递给责任链中的下一个处理器。
1.目的
责任链模式可以让处理器按以下方式处理:如果需要则处理请求,否则将请求传递给下一个处理器。
2.实现
如图3-1所示的类图描述了责任链模式的结构和行为。
图 3-1
图3-1包括以下类:
Client(客户端):客户端是使用责任链模式的应用程序的主要结构。它的职责是实例化一个处理器的链,然后在第一个对象中调用handleRequest方法。
Handler(处理器):这是一个抽象类,提供给所有实际处理器进行继承。它拥有一个handleRequest方法,用来接收需要处理的请求。
ConcreteHandler(具体处理器):这是一个实现了handleRequest方法的具体类。每一个具体处理器都维持一个引用,指向链中下一个具体处理器,需要检查它自身是否能处理这个请求,不能就将请求传递给链中的下一个具体处理器。
每一个处理器需要实现一个方法,该方法被客户端所使用,并能够设置下一个处理器,当它无法处理请求时,将请求传给下一个处理器。这个方法可以加入到Handle基类当中。
在每一个ConcreteHandler类中,我们实现下列代码,检查它是否能处理请求,不能则会传递请求:
客户端负责在调用链头之前建立处理器链。这次调用会被传递,直到发现了能正确处理这个请求的处理器。
以汽车服务程序为例。每有一个损坏的汽车进入,首先由机修工进行检查,如果在机修工的专业范围内,机修工会对汽车进行维修。如果机修工不会维修,他们会把损坏的汽车传递给电工。如果电工也无法修理坏车,他们会将车交给下一个专家。
图3-2展示了如何运行。
图 3-2
3.适用情况和示例
以下是责任链模式的适用情况和示例:
事件处理器:举个例子,大部分图形用户界面框架使用责任链模式来处理事件。例如,一个窗口包含了一个面板,面板上有一些按钮,我们需要写按钮的事件处理器。如果我们决定跳过它并传递它,责任链中的下一个处理器面板将会处理这个请求。如果面板也跳过了它,它将会被传递到窗口。
日志处理器:与事件处理器类似,每一个处理器都要么记录一个基于其状态的特殊请求,要么将请求传送给下一个处理器。
servlet:在Java中,javax.servlet.Filter(http://docs.oracle.com/javaee/7/api/javax/
servlet/Filter.html)被用来过滤请求或者响应。doFilter方法把过滤器链作为一个参数接收,它能够传递请求。
- 点赞
- 收藏
- 关注作者
评论(0)