• 设计模式之第13章-职责链模式(Java实现)


    设计模式之第13章-职责链模式(Java实现)

      “请假都那么麻烦,至于么。”“咋的了?”“这不快过年了么,所以我想早两天回去,准备一下,买买东西什么的,然后去给项目经理请假,但是他说快过年了,所以这个事儿他没法决定,所以只能找总经理了,你说麻不麻烦。”“这不是很正常么,现在好多事不都是这样的,尤其是那些大公司,制度完善,分工更加细致,层级多,更麻烦。不过这就牵扯到今天的职责链模式了。”“什么?这都能扯到传说中的职责链模式?”

    职责链模式之自我介绍

      当当当当~我就是人见人耐,花见花开,车见车爆胎的职责链是也。人们都我的定义是:Avoid coupling the sender of a request to its receiver by giving more than one object a chance to handle the request.Chain the receiving objects and pass the request along the chain until an object handles it.意思是:使多个对象都有机会处理请求,从而避免了请求的发送者和接受者之间的耦合关系,将这些对象连成一条链,并沿着这条链传递该请求,直到有对象处理它为止。职责链重点在“链”上,由一条链去处理相似的请求在链中决定谁来处理这个请求,并返回相应的结果,它的通用类图是:

      至于类图的含义么,讲的这么清楚的图我就不再赘述了。(作者按:挺好,颇有我的风格。众人:被作者带坏的某人。)

    职责链模式之自我分析

      我呢,比他们差远了,因为印象中我好像全是缺点的说。(场下响起热烈的掌声。众人:看看,人家多谦虚,哪像前面几个,都声称自己毫无缺点,谁信啊,哪有那么完美的存在,俗话说:不存在银弹的好吗。躺枪的某些模式们。)我的缺点嘛,如下:

    • 性能不是很好,由于从链头开始遍历,因此链比较长的时候性能问题将会暴漏。
    • 调试不便。链长后所带来的问题。
    • 不保证被接受。若无明确的接受者,无法保证一定被处理。

      突然想起来貌似还是有那么一丢丢优点的:

    • 降低耦合度。
    • 增强了给对象指派职责的灵活性。

    职责链之实现

      我们就以大家常见的请假来具体实现一下职责链模式。首先是员工,也就是程序员的接口:

    1 public interface IEmployee{
    2     //获取请求级别
    3     public int getType();
    4     //获取个人请示
    5     public String getRequest();
    6 }

      接下来是员工的具体实现类:  

     1 public class Employee implements IEmployee{
     2     //请假
     3     private String request = "";
     4     //请求级别
     5     private int type = 0;
     6 
     7     public Employee(String req, int type){
     8         this.req = request;
     9         this.type = type;
    10     }
    11 
    12     public int getType(){
    13         return this.type;
    14     }
    15 
    16     public String getRequest(){
    17         return this.request;
    18     }
    19 }
    View Code

      员工请假总要找人请示,而管理层的人的接口Handler代码如下:

     1 public abstract class Handler{
     2     public final static int MANAGER_REQUEST = 1;
     3     public final static int PROJECT_MANAGER = 2 4 
     5     //能处理的级别
     6     private int level = 0;
     7     //责任传递给下一个负责人
     8     private Handler nextHandler;
     9     //每个类说明一下自己能处理的请求
    10     public Handler(int lev)
    11     {
    12         this.lev = level;
    13     }
    14     //处理请求
    15     public final void HandleMessage(IEmployee emp){
    16         if (emp.getType() == this.level) {
    17             this.response(emp);
    18         }
    19         else{
    20             if(this.nextHandler != null){
    21                 //处理不了请求,将请求上报给上层
    22                 this.nextHandler.HandleMessage(emp);
    23             }
    24             else{
    25                 //无上层领导了
    26                 System.out.println("默认好不好了");
    27             }
    28         }
    29     }
    30     //不归你管的请求,不能僭越,要找下一层
    31     public void setNext(Handler han){
    32         this.nextHandler = han;
    33     }
    34 
    35     //对于请求的回应
    36     protected abstract void response(IEmployee emp);
    37 }
    View Code

      下面是具有管理权限的第一层项目经理的实现类,实现类中首先确定自己能处理的级别,然后就是对于请求作出回应。

     1 public class ProjectManager extends Handler{
     2     //只能处理部分员工的请求:
     3     public ProjectManager(){
     4         super(Handler.PROJECT_MANAGER);
     5     }
     6     //答复
     7     protected void response(IEmployee emp){
     8         System.out.println("员工要请假");
     9         System.out.println(emp.getRequest());
    10         System.out.println("我管不了啊,要问领导了");
    11     }
    12 }

      接下来是总经理类,同样是确定能处理事情的级别以及作出回应。

     1 public class Manager extends Handler{
     2     //请求级别
     3     public Manager(){
     4         super(Handler.MANAGER_REQUEST);
     5     }
     6     //回复
     7     protected void response(IEmployee emp){
     8         System.out.println("员工要请假");
     9         System.out.println(emp.getRequest());
    10         System.out.println("准!");
    11     }
    12 }

      好了,以上就是其具体的实现了。

    职责链模式之应用场景

      应用场景还是蛮多的,以下情况就可以用到:

    • 有多个对象可以处理一个请求的时候。
    • 可处理一个请求的对象集合应被动态的指定。
    • 在不明确指定接收者的情况下,向多个对象中的一个提交一个请求。

      好了。That‘s all。下面由鱼哥讲话。(我勒个去,这孩子好有眼力劲儿。)那个,我也没什么可说的了。吃饭去了。

     

     

      PS:本博客欢迎转发,但请注明博客地址及作者~

      博客地址:http://www.cnblogs.com/voidy/

      博客新址:http://voidy.net

      <。)#)))≦

  • 相关阅读:
    转:Jenkins自动化部署入门详细教程
    详解MySQL锁
    常见的内存溢出与解决办法
    read IEEE Standard for verilog(1)
    verilog之状态机
    quantus18的signaltap逻辑分析仪
    英语文档之关键词统计
    cadence软件画版图操作
    英语文档之vivado界面
    verilog之wire和reg
  • 原文地址:https://www.cnblogs.com/voidy/p/4247936.html
Copyright © 2020-2023  润新知