《Java设计模式及实践》—3 行为型模式

举报
华章计算机 发表于 2019/07/22 13:13:08 2019/07/22
【摘要】 本节书摘来自华章计算机《Java设计模式及实践》一书中的第3章,第3.1节,[印度] 卡马尔米特·辛格(Kamalmeet Singh)[荷兰] 艾德里安·伊恩库列斯库(Adrian Ianculescu) 著[罗马尼亚] 路西安-保罗·托尔耶(Lucian-Paul Torje) 张小坤 黄 凯 贺 涛 译.

第3章

行为型模式

本章介绍行为型模式。行为型模式关注对象交互、通信和控制流。大多数行为型模式都基于组合和委托而不是继承。我们将在本章中研究以下行为型模式:

  • 责任链模式

  • 命令模式

  • 解释器模式

  • 迭代器模式

  • 观察者模式

  • 中介者模式

  • 备忘录模式

  • 状态模式

  • 策略模式

  • 模板方法模式

  • 空对象模式

  • 访问者模式

3.1 责任链模式

计算机软件是用来处理信息的,有多种不同的方式来组织和处理信息。从前文了解到,当我们在讨论面向对象编程时,应该赋予一个类单一的职责,从而使得类容易维护和扩展。

设想一个场景,需要对一批从客户端来的数据进行多种不同的操作,我们会使用多个不同的类负责不同的操作,而不是使用一个类集成所有操作,这样做能让代码松耦合且简洁。

这些类被称为处理器,第一个处理器会接收请求,如果它需要执行操作则会进行一次调用,如果不需要则会将请求传递给第二个处理器。类似地,第二个处理器确认并将请求传递给责任链中的下一个处理器。

1.目的

责任链模式可以让处理器按以下方式处理:如果需要则处理请求,否则将请求传递给下一个处理器。

2.实现

如图3-1所示的类图描述了责任链模式的结构和行为。

 image.png

图 3-1

图3-1包括以下类:

  • Client(客户端):客户端是使用责任链模式的应用程序的主要结构。它的职责是实例化一个处理器的链,然后在第一个对象中调用handleRequest方法。

  • Handler(处理器):这是一个抽象类,提供给所有实际处理器进行继承。它拥有一个handleRequest方法,用来接收需要处理的请求。

  • ConcreteHandler(具体处理器):这是一个实现了handleRequest方法的具体类。每一个具体处理器都维持一个引用,指向链中下一个具体处理器,需要检查它自身是否能处理这个请求,不能就将请求传递给链中的下一个具体处理器。

每一个处理器需要实现一个方法,该方法被客户端所使用,并能够设置下一个处理器,当它无法处理请求时,将请求传给下一个处理器。这个方法可以加入到Handle基类当中。

 image.png

在每一个ConcreteHandler类中,我们实现下列代码,检查它是否能处理请求,不能则会传递请求:

 image.png

客户端负责在调用链头之前建立处理器链。这次调用会被传递,直到发现了能正确处理这个请求的处理器。

以汽车服务程序为例。每有一个损坏的汽车进入,首先由机修工进行检查,如果在机修工的专业范围内,机修工会对汽车进行维修。如果机修工不会维修,他们会把损坏的汽车传递给电工。如果电工也无法修理坏车,他们会将车交给下一个专家。

图3-2展示了如何运行。

 image.png

图 3-2

3.适用情况和示例

以下是责任链模式的适用情况和示例:

  • 事件处理器:举个例子,大部分图形用户界面框架使用责任链模式来处理事件。例如,一个窗口包含了一个面板,面板上有一些按钮,我们需要写按钮的事件处理器。如果我们决定跳过它并传递它,责任链中的下一个处理器面板将会处理这个请求。如果面板也跳过了它,它将会被传递到窗口。

  • 日志处理器:与事件处理器类似,每一个处理器都要么记录一个基于其状态的特殊请求,要么将请求传送给下一个处理器。

  • servlet:在Java中,javax.servlet.Filter(http://docs.oracle.com/javaee/7/api/javax/

servlet/Filter.html)被用来过滤请求或者响应。doFilter方法把过滤器链作为一个参数接收,它能够传递请求。


【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。