博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Android设计模式——责任链模式。
阅读量:3700 次
发布时间:2019-05-21

本文共 3597 字,大约阅读时间需要 11 分钟。

跟小伙伴聊天听到一个责任链模式,感觉能避免大量if   else,这里用一个例子记录一下。

抽象处理者角色类:设置/获取继承者,处理实现。

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);      }

具体处理者角:

public class ProjectManager extends Handler {                @Override          public String handleFeeRequest(String user, double fee) {                            String str = "";              //项目经理权限比较小,只能在500以内              if(fee < 500)              {                  str = "成功:项目经理同意【" + user + "】的聚餐费用,金额为" + fee + "元";             }else              {                  //超过500,继续传递给级别更高的人处理                  if(getSuccessor() != null)                  {                      return getSuccessor().handleFeeRequest(user, fee);                  }              }              return str;          }            }
public class DeptManager extends Handler {                @Override          public String handleFeeRequest(String user, double fee) {                            String str = "";              //部门经理的权限只能在1000以内              if(fee < 1000)              {                  //为了测试,简单点,只同意张三的请求                  str = "成功:部门经理同意【" + user + "】的聚餐费用,金额为" + fee + "元";                  }else              {                  //超过1000,继续传递给级别更高的人处理                  if(getSuccessor() != null)                  {                      return getSuccessor().handleFeeRequest(user, fee);                  }              }              return str;          }            }

public class GeneralManager extends Handler {        @Override      public String handleFeeRequest(String user, double fee) {                    String str = "";          //总经理的权限很大,只要请求到了这里,他都可以处理          if(fee >= 1000)          {              str = "成功:总经理同意【" + user + "】的聚餐费用,金额为" + fee + "元";                          }else          {              //如果还有后继的处理对象,继续传递              if(getSuccessor() != null)              {                  return getSuccessor().handleFeeRequest(user, fee);              }          }          return str;      }    }

public class Client {                public static void main(String[] args) {              //先要组装责任链              Handler h1 = new GeneralManager();              Handler h2 = new DeptManager();              Handler h3 = new ProjectManager();              h3.setSuccessor(h2);              h2.setSuccessor(h1);                            //开始测试              String test1 = h3.handleFeeRequest("张三", 300);              System.out.println("test1 = " + test1);                            String test2 = h3.handleFeeRequest("张三", 700);              System.out.println("test2 = " + test2);                            String test3 = h3.handleFeeRequest("张三", 1500);              System.out.println("test3 = " + test3);          }            }

职责链灵活在哪
1. 改变内部的传递规则
在内部,项目经理完全可以跳过人事部到那一关直接找到总经理。
每个人都可以去动态地指定他的继任者。
2. 可以从职责链任何一关开始。
如果项目经理不在,可以直接去找部门经理,责任链还会继续,没有影响。
3.用与不用的区别
不用职责链的结构,我们需要和公司中的每一个层级都发生耦合关系。
如果反映在代码上即使我们需要在一个类中去写上很多丑陋的if….else语句。
如果用了职责链,相当于我们面对的是一个黑箱,我们只需要认识其中的一个部门,然后让黑箱内部去负责传递就好了

原帖:http://blog.csdn.net/jason0539/article/details/45091639

你可能感兴趣的文章
How Does EDI Work?
查看>>
Paper-based vs EDI Transaction Process --
查看>>
100 人内芯片设计初创公司 IT 方案(上)
查看>>
100 人内芯片设计初创公司 IT 方案(中)
查看>>
100 人内芯片设计初创公司 IT 方案(下)
查看>>
IBM Spectrum LSF
查看>>
IBM Spectrum LSF Suites
查看>>
IBM Spectrum LSF Application Center
查看>>
IBM Spectrum LSF Process Manager
查看>>
IBM Spectrum LSF Data Manager
查看>>
IBM Spectrum LSF Explorer
查看>>
IBM Spectrum LSF License Scheduler
查看>>
IBM Spectrum LSF RTM
查看>>
IBM Spectrum LSF-手册
查看>>
评估HPC工作负载管理解决方案时的主要注意事项(一)
查看>>
评估HPC工作负载管理解决方案时的主要注意事项(二)
查看>>
评估HPC工作负载管理解决方案时的主要注意事项(三)
查看>>
OpenText内容套件
查看>>
如何在2021年选择最佳的内容服务平台
查看>>
OpenText Content Suite平台
查看>>