职责链的本质:分离职责,动态组合
样例


/**
 * 定义职责对象的接口
 *
 */
public abstract class Handler {

          protected Handler successor;

          /**
           * 设置下一个处理请求对象
           * @param successor
           */
         public void setSuccessor(Handler successor) {
                    this.successor = successor;
         }
         /**
          * 处理聚餐费用的申请
          * @param user 申请人
          * @param fee 申请的费用
          * @return
          */
        public abstract String handlerFeeRequest(String user, double fee);
}

/**
 * 部门经理审批
 *
 */
public class DepManager extends Handler {

          @Override
          public String handlerFeeRequest(String user, double fee) {

                    String str = "";

                    if(fee < 1000) {
                                 if("Joe".equals(user)) {
                                        str = "Department manager agreed " + user + "'s request, the fee is $" + fee;
                                 } else {
                                        str = "Department manager didn't agree " + user + "'s request.";
                                 }
                                 return str;
                    }
                    // more than $1000, next to others.
                    if(this.successor != null) {
                              return successor.handlerFeeRequest(user, fee);
                    }
                    return str;
         }
}

/**
 * 项目经理审批
 *
 */
public class ProjectManager extends Handler {

          @Override
          public String handlerFeeRequest(String user, double fee) {
                    String str = "";

                    if(fee < 500) {
                               if("Joe".equals(user)) {
                                      str = "Project manager agreed " + user + "'s request, the fee is $" + fee;
                                }  else {
                                      str = "Project manager didn't agree " + user + "'s request.";
                                }
                                return str;
                    }
                    // more than $500, next to others.
                   if(this.successor != null) {
                            return successor.handlerFeeRequest(user, fee);
                   }
                   return str;
         }
}

/**
 * 总经理审批
 *
 */
public class GeneralManager extends Handler {

          @Override
          public String handlerFeeRequest(String user, double fee) {
                    String str = "";

                    if(fee >= 1000) {
                              if("Joe".equals(user)) {
                                         str = "General manager agreed " + user + "'s request, the fee is $" + fee;
                              } else {
                                         str = "General manager didn't agree " + user + "'s request.";
                              }
                              return str;
                   }
                   // next to others.
                   if(this.successor != null) {
                             return successor.handlerFeeRequest(user, fee);
                   }
                   return str;
          }
}

public class Client {

           public static void main(String[] args) {
                      Handler h1 = new ProjectManager();
                      Handler h2 = new DepManager();
                      Handler h3 = new GeneralManager();

                      h2.setSuccessor(h3);
                      h1.setSuccessor(h2);

                      String ret1 = h1.handlerFeeRequest("Joe", 300);
                      System.out.println(ret1);
                      String ret2 = h1.handlerFeeRequest("Yoyo", 300);
                      System.out.println(ret2);

                      String ret3 = h1.handlerFeeRequest("Joe", 800);
                      System.out.println(ret3);
                      String ret4 = h1.handlerFeeRequest("Yoyo", 800);
                      System.out.println(ret4);

                      String ret5 = h1.handlerFeeRequest("Joe", 1300);
                      System.out.println(ret5);
                      String ret6 = h1.handlerFeeRequest("Yoyo", 1300);
                      System.out.println(ret6);
          }
}

java设计模式---职责链模式的更多相关文章

  1. JAVA 设计模式 职责链模式

    用途 职责链模式 (Chain Of Responsibility) 使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系. 将这个对象连成一条链,并沿着这条链传递该请求,直到有一个 ...

  2. 17. 星际争霸之php设计模式--职责链模式

    题记==============================================================================本php设计模式专辑来源于博客(jymo ...

  3. 【设计模式】Java设计模式 - 责任链模式

    [设计模式]Java设计模式 - 责任链模式 不断学习才是王道 继续踏上学习之路,学之分享笔记 总有一天我也能像各位大佬一样 一个有梦有戏的人 @怒放吧德德 目录 [设计模式]Java设计模式 - 责 ...

  4. OOP设计模式[JAVA]——03职责链模式

    职责链模式 Responsibility of Chain 在职责链模式里,很多对象由每一个对象对其下家的引用而连接起来形成一条链.请求在这个链上传递,直到链上的某一个对象决定处理此请求.发出这个请求 ...

  5. java 之 职责链模式(大话设计模式)

    目前很多OA办公自动化软件,加快了办公效率,简化流程.相信很多小伙伴都用过.笔者了解到的大多数办公软件底层实现流程大多数采用的都是Activity或者是JBPM框架. 今天笔者要说的也是类似于流程的一 ...

  6. 设计模式:职责链模式(Chain of Responsibility)

    去年参加校招要到长沙来,这个对于我来说不是特别喜欢(但又必须的来,谁叫咱不是985.211的娃呢),但是对于某些人来说就是福音了.大四还有课,而且学校抓的比较严,所以对于那些想翘课的人来说这个是最好不 ...

  7. 深入浅出设计模式——职责链模式(Chain of Responsibility Pattern)

    模式动机 职责链可以是一条直线.一个环或者一个树形结构,最常见的职责链是直线型,即沿着一条单向的链来传递请求.链上的每一个对象都是请求处理者,职责链模式可以将请求的处理者组织成一条链,并使请求沿着链传 ...

  8. C++设计模式——职责链模式

    什么是职责链模式? 在GOF的<设计模式:可复用面向对象软件的基础>一书中对职责链模式是这样说的:使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系.将这些对象连成一条 ...

  9. java 设计模式 -- 责任链模式

    设计模式 – 责任链模式 介绍: 责任链模式是一种动态行为模式,有多个对象,每一个对象分别拥有其下家的引用.连起来形成一条链.待处理对象则传到此链上,在此链进行传递,且待处理对象并不知道此会被链上的哪 ...

随机推荐

  1. c# datatable增加列并赋值

    DataView dv = DataObj.GetBmfzr("03").Tables[0].DefaultView; dv.Sort = "bmbh"; Da ...

  2. Spring Cloud 服务端注册与客户端调用

    Spring Cloud 服务端注册与客户端调用 上一篇中,我们已经把Spring Cloud的服务注册中心Eureka搭建起来了,这一章,我们讲解如何将服务注册到Eureka,以及客户端如何调用服务 ...

  3. Jenkins执行批处理文件、powershell失败

    今天搭建Jenkins持续集成环境,编译环境是.net core.整理了一些发布的命令配置在Jenkins,问题来了,使用powershell插件运行dotnet restore.dotnet bui ...

  4. Android ImgView属性

    ImageView是用于界面上显示图片的控件. 属性 1.为ImageView设置图片 ①android:src="@drawable/img1": src设置图片,默认图片等比例 ...

  5. pip: unsupported locale setting

    在终端里输入 $ export LC_ALL=C 可解决 http://stackoverflow.com/questions/36394101/pip-install-locale-error-un ...

  6. 吐槽:【计算机网络与通信】.张元.高清文字版.pdf

    看了这本书的pdf,发现了一处错误,瞬间就不想再看了.新下载了谢希仁老师的<计算机网络>.

  7. ABP文档笔记系列

    ABP文档笔记 - 模块系统 及 配置中心 ABP文档笔记 - 事件BUS ABP文档笔记 - 数据过滤 ABP文档笔记 - 规约 ABP文档笔记 - 配置.设置.版本.功能.权限 ABP文档笔记 - ...

  8. MacOS下Rails+Nginx+SSL环境的搭建(中)

    三.配置Nginx 先是修改 hosts 文件,意思是创建一个本地域名以便我们访问,比如: $ sudo subl /etc/hosts 127.0.0.1 rails_project.local 但 ...

  9. ajax中xmlhttp.readyState和xmlhttp.status的值及解释

    xmlhttp.readyState的值及解释: 0:请求未初始化(还没有调用 open()). 1:请求已经建立,但是还没有发送(还没有调用 send()). 2:请求已发送,正在处理中(通常现在可 ...

  10. activiti 动态配置 activiti 监听引擎启动和初始化(高级源码篇)

    1.1.1. 前言 用户故事:现在有这样一个需求,第一个需求:公司的开发环境,测试环境以及线上环境,我们使用的数据库是不一样的,我们必须能够任意的切换数据库进行测试和发布,对数据库连接字符串我们需要加 ...