职责链模式

发布时间: 更新时间: 总字数:1075 阅读时间:3m 作者: IP上海 分享 网址

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.(使多个对象都有机会处理请求,从而避免了请求的发送者和接受者之间的耦合关系,将这些对象连成一条链,并沿着这条链传递该请求,直到有对象处理它为止。)

职责链模式介绍

职责链重点在“链”上,由一条链去处理相似的请求在链中决定谁来处理这个请求,并返回相应的结果,它的通用类图是:

职责链模式分析

缺点:

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

优点:

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

职责链之实现

Golang

Java

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

public interface IEmployee{
    //获取请求级别
    public int getType();
    //获取个人请示
    public String getRequest();
}

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

public class Employee implements IEmployee{
    //请假
    private String request = "";
    //请求级别
    private int type = 0;

    public Employee(String req, int type){
        this.req = request;
        this.type = type;
    }

    public int getType(){
        return this.type;
    }

    public String getRequest(){
        return this.request;
    }
}

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

public abstract class Handler{
    public final static int MANAGER_REQUEST = 1;
    public final static int PROJECT_MANAGER = 2;

    //能处理的级别
    private int level = 0;
    //责任传递给下一个负责人
    private Handler nextHandler;
    //每个类说明一下自己能处理的请求
    public Handler(int lev)
    {
        this.lev = level;
    }
    //处理请求
    public final void HandleMessage(IEmployee emp){
        if (emp.getType() == this.level) {
            this.response(emp);
        }
        else{
            if(this.nextHandler != null){
                //处理不了请求,将请求上报给上层
                this.nextHandler.HandleMessage(emp);
            }
            else{
                //无上层领导了
                System.out.println("默认好不好了");
            }
        }
    }
    //不归你管的请求,不能僭越,要找下一层
    public void setNext(Handler han){
        this.nextHandler = han;
    }

    //对于请求的回应
    protected abstract void response(IEmployee emp);
}

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

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

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

public class Manager extends Handler{
    //请求级别
    public Manager(){
        super(Handler.MANAGER_REQUEST);
    }
    //回复
    protected void response(IEmployee emp){
        System.out.println("员工要请假");
        System.out.println(emp.getRequest());
        System.out.println("准!");
    }
}

职责链模式之应用场景

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

  • 有多个对象可以处理一个请求的时候。
  • 可处理一个请求的对象集合应被动态的指定。
  • 在不明确指定接收者的情况下,向多个对象中的一个提交一个请求。
  • javax.Serverlet
Home Archives Categories Tags Statistics
本文总阅读量 次 本站总访问量 次 本站总访客数