2019独角兽企业重金招聘Python工程师标准>>>

角色

抽象处理者角色(Handler):定义出一个处理请求的接口。如果需要,接口可以定义 出一个方法以设定和返回对下家的引用。这个角色通常由一个Java抽象类或者Java接口实现。

具体处理者角色(ConcreteHandler):具体处理者接到请求后,可以选择将请求处理掉,或者将请求传给下家。由于具体处理者持有对下家的引用,因此,如果需要,具体处理者可以访问下家。

抽象处理者角色

[java] view plain copy print?在CODE上查看代码片派生到我的代码片

public abstract class Handler {

/**

* 持有后继的责任对象

*/

protected Handler successor;

/**

* 示意处理请求的方法,虽然这个示意方法是没有传入参数的

* 但实际是可以传入参数的,根据具体需要来选择是否传递参数

*/

public abstract void handleRequest();

/**

* 取值方法

*/

public Handler getSuccessor() {

return successor;

}

/**

* 赋值方法,设置后继的责任对象

*/

public void setSuccessor(Handler successor) {

this.successor = successor;

}

}

具体处理者角色

[java] view plain copy print?在CODE上查看代码片派生到我的代码片

public class ConcreteHandler extends Handler {

/**

* 处理方法,调用此方法处理请求

*/

@Override

public void handleRequest() {

/**

* 判断是否有后继的责任对象

* 如果有,就转发请求给后继的责任对象

* 如果没有,则处理请求

*/

if(getSuccessor() != null)

{

System.out.println("放过请求");

getSuccessor().handleRequest();

}else

{

System.out.println("处理请求");

}

}

}

客户端类

[java] view plain copy print?在CODE上查看代码片派生到我的代码片

public class Client {

public static void main(String[] args) {

//组装责任链

Handler handler1 = new ConcreteHandler();

Handler handler2 = new ConcreteHandler();

handler1.setSuccessor(handler2);

//提交请求

handler1.handleRequest();

}

}

可以看出,客户端创建了两个处理者对象,并指定第一个处理者对象的下家是第二个处理者对象,而第二个处理者对象没有下家。然后客户端将请求传递给第一个处理者对象。

由于本示例的传递逻辑非常简单:只要有下家,就传给下家处理;如果没有将查询结果封装成对象下家,就自行处理。

因此,第一个处理者对象接到请求后,会将请求传递给第二个处理者对象。由于第二个处理者对象没有下家,于是自行处理请求。活动时序图如下所示。

应用

申请聚餐费用的管理,申请聚餐费用的大致流程一般是,由申请人先填写申请单,然后交给领导审批,如果申请批准下来,领导会通知申请人审批通过,然后申请人去财务领取费用,如果没有批准下来,领导会通知申请人审批未通过,此事也就此作罢。

不同级别的领导,对于审批的额度是不一样的,比如,项目经理只能审批500将查询结果封装成对象元以内的申请;部门经理能审批1000元以内的申请;而总经理可以审核任意额度的申请。

当某人提出聚餐费用申请的请求后,该请求会经由项目经理、部门经理、总经理之中的某一位领导来进行相应的处理,但是提出申请的人并不知道最终会由谁来处理他的请求,一般申请人是把自己的申请提交给项目经理,或许最后是由总经理来处理他的请求。申请人只要直接与项目经理交互就可以,其余的工作在黑盒中,究竟流程是怎样的,最后是由谁审批通过的,申请人无需关心。

抽象处理者角色类

[java] view plain copy print?在CODE上查看代码片派生到我的代码片

public abstract class Handler {

/**

* 持有下一个处理请求的对象 将查询结果封装成对象

*/

protected Handler successor = null;

/**

* 取值方法

*/

public Handler getSuccessor() {

return successor;

}

/**

* 设置下一个处理请求的对象

*/

public void setSuccessor(Handler successor) {

this.successor = successor;

}

/**

* 处理聚餐费用的申请

* @param user    申请人

* @param fee    申请的钱数

* @return        成功或失败的具体通知

*/

public abstract String handleFeeRequest(String user , double fee);

}

具体处理者角色

[java] view plain copy print?在CODE上查看代码片派生到我的代码片

public class ProjectManager extends Handler {

@Override

public String handleFeeRequest(String user, double fee) {

String str = "";

//项目经理权限比较小,只能在500以内

if(fee < 500)

{

//为了测试,简单点,只同意张三的请求

if("张三".equals(user))

使多个对象都有机会处理请求,从而避免请求的发送者和接受者之间的耦合关系,

将这个对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理他为止。

角色

抽象处理者角色(Handler):定义出一个处理请求的接口。如果需要,接口可以定义 出一个方法以设定和返回对下家的引用。这个角色通常由一个Java抽象类或者Java接口实现。

具体处理者角色(ConcreteHandler):具体处理者接到请求后,可以选择将请求处理掉,或者将请求传给下家。由于具体处理者持有对下家的引用,因此,如果需要,具体处理者可以访问下家。

抽象处理者角色

[java] view plain copy print?在CODE上查看代码片派生到我的代码片

public abstract class Handler {

/**

* 持有后继的责任对象

*/

protected Handler successor;  将查询结果封装成对象

/**

* 示意处理请求的方法,虽然这个示意方法是没有传入参数的

* 但实际是可以传入参数的,根据具体需要来选择是否传递参数

*/

public abstract void handleRequest();

/**

* 取值方法

*/

public Handler getSuccessor() {

return successor;

}

/**

* 赋值方法,设置后继的责任对象

*/

public void setSuccessor(Handler successor) {

this.successor = successor;

}

}

具体处理者角色

[java] view plain copy print?在CODE上查看代码片派生到我的代码片

public class ConcreteHandler extends Handler {

/**

* 处理方法,调用此方法处理请求

*/

@Override

public void handleRequest() {

/**

* 判断是否有后继的责任对象

* 如果有,就转发请求给后继的责任对象

* 如果没有,则处理请求

*/

if(getSuccessor() != null)

{

System.out.println("放过请求");

getSuccessor().handleRequest();

}else

{

System.out.println("处理请求");

}

}

}

客户端类

[java] view plain copy print?在CODE上查看代码片派生到我的代码片

public class Client {

public static void main(String[] args) {

//组装责任链

Handler handler1 = new ConcreteHandler();

Handler handler2 = new ConcreteHandler();

handler1.setSuccessor(handler2);

//提交请求

handler1.handleRequest();

}

}

可以看出,客户端创建了两个处理者对象,并指定第一个处理者对象的下家是第二个处理者对象,而第二个处理者对象没有下家。然后客户端将请求传递给第一个处理者对象。

由于本示例的传递逻辑非常简单:只要有下家,就传给下家处理;如果没有下家,就自行处理。

因此,第一个处理者对象接到请求后,会将请求传递给第二个处理者对象。由于第二个处理者对象没有下家,于是自行处理请求。活动时序图如下所示。

应用

申请聚餐费用的管理,申请聚餐费用的大致流程一般是,由申请人先填写申请单,然后交给领导审批,如果申请批准下来,领导会通知申请人审批通过,然后申请人去财务领取费用,如果没有批准下来,领导会通知申请人审批未通过,此事也就此作罢。

不同级别的领导,对于审批的额度是不一样的,比如,项目经理只能审批500元以内的申请;部门经理能审批1000元以内的申请;而总经理可以审核任意额度的申请。

当某人提出聚餐费用申请的请求后,该请求会经由项目经理、部门经理、总经理之中的某一位领导来进行相应的处理,但是提出申请的人并不知道最终会由谁来处理他的请求,一般申请人是把自己的申请提交给项目经理,或许最后是由总经理来处理他的请求。申请人只要直接与项目经理交互就可以,其余的工作在黑盒中,究竟流程是怎样的,最后是由谁审批通过的,申请人无需关心。

转载于:https://my.oschina.net/dengdajun/blog/650500

java23中设计模式——行为模式——Chain of Responsibility(职责链)相关推荐

  1. 职责链模式 php,php Chain of Responsibility 职责链模式

    //被*攻击的接口 interface NuclearAttacked { //处理被*攻击的方法,参数为投放点的x和y坐标 public function NuclearAttacked($x, $ ...

  2. 22.Chain of Responsibility(职责链)模式

    技术交流QQ群:1027579432,欢迎你的加入! 1.Chain of Responsibility(职责链)模式动机 在软件构建过程中,一个请求可能被多个对象处理,但是每个请求在运行时只能有一个 ...

  3. 步步为营 .NET 设计模式学习笔记 十九、Chain of Responsibility(职责链模式)

    概述 在软件构建过程中,一个请求可能被多个对象处理,但是每个请求在运行时只能有一个接受者,如果显示指定,将必不可少地带来请求发送者与接受者的紧耦合. 如何使请求的发送者不需要指定具体的接受者?让请求的 ...

  4. 设计模式之略见一斑(Chain of Responsibility责任链模式)

    设计模式 写道 面向对象开发人员通常希望明确和减少对象间的责任,从而降低对象之间的耦合程序.这样我们的系统更加容易修改,同时也可降低产生缺陷的风险.从某种程度上说,java语言本身能够帮助降低对象间的 ...

  5. Chain of Responsibility(责任链模式) 行为型

    责任链模式 一.概述 二.结构 三.适用场景 四.优缺点 五.实例 一.概述 描述:如组长不能处理的金额,需要向经理请求,经理不能请求的需要向老板请求,这样就现成了一条链,每个级别都能处理这金额.而不 ...

  6. Chain of Responsibility -- 责任链模式

    在软件构建构成中,一个请求可能被多个对象处理,但是每个请求在运行时只能有一个接收者,如果显示指定,将必不可少地带来请求发送者与接收者的紧密耦合.COR(Chain of Reposibility)设计 ...

  7. Chain of Responsibility 责任链模式 MD

    责任链模式 简介 责任链模式是一种对象的行为模式.在责任链模式里,很多对象由每一个对象对其下家的引用而连接起来形成一条链,请求在这个链上[传递],直到链上的某一个对象决定处理此请求.发出这个请求的客户 ...

  8. 设计模式(一)Chain Of Responsibility责任链模式

    设计模式篇章,源于网课的学习,以及个人的整理 在我们接收用户提交的字符时,常常会使用到过滤,在学习责任链模式前,我们是这样做的 1.定义一个类 public class MsgProcesser {S ...

  9. 设计模式之职责链模式(Chain of Responsibility)摘录

    23种GOF设计模式一般分为三大类:创建型模式.结构型模式.行为模式. 创建型模式抽象了实例化过程,它们帮助一个系统独立于如何创建.组合和表示它的那些对象.一个类创建型模式使用继承改变被实例化的类,而 ...

最新文章

  1. 003-读书笔记-Vue官网 计算属性与监听器
  2. x3650m5不自动进系统_17日起,泉州这个地方自动抓拍系统启用!这些车闯红灯、严重超载、不按道行驶被查处曝光!【交通大整治】...
  3. oracle crm版本,ORACLE CRM ON DEMAND 19 版
  4. 基于事件驱动架构构建微服务第10部分:在docker容器内运行单元测试
  5. docker学习指南
  6. Vector Packet Processing(VPP) (一)简介
  7. 不推荐使用getResources()。getColor()[重复]
  8. 通过java读取.properties 配置文件
  9. matlab2c使用c++实现matlab函数系列教程-floor函数
  10. 【首度披露】乐视电商云的整体架构与技术实现
  11. 嵌入式linux环境搭建
  12. 笔记本 无线网联网 win10系统 ,台式机木有无线网卡,通过一根网线连接两台电脑,使台式机联网。...
  13. PEST分析顺丰服务需求_顺丰内外部环境分析.doc
  14. 简单易懂的颜色透明度计算
  15. android蓝牙打印机打印图片,如何使用打印机(通过蓝牙打印)从Android设备打印图像和一些数据?...
  16. ABAP 动态控制选择屏幕 / Free Selection
  17. 国标28181:什么是RTP协议与RTCP协议
  18. 百度质量部面试体验之 三面
  19. 汽车保养猫腻太多,名悦集团教你轻松养车省钱省力
  20. windows版 redis启动、rabbitMQ启动、kafka启动

热门文章

  1. 排序算法----桶排序(数组)
  2. PyCharm5.0.2最新版破解注册激活码
  3. FPGA之VGA控制
  4. 利用栈实现递归函数的非递归计算
  5. zookeeper启动失败
  6. Android学习之NDK环境的配置
  7. Linux发行版CentOS下Docker的安装和卸载
  8. html设置下拉筛选可以多选,select下拉框(支持筛选、多选)
  9. 计算机vf的讲解,计算机二级vf重点知识讲解.doc
  10. java抢购防止多次请求_springboot项目中接口防止恶意请求多次