设计模式学习之职责链模式

1、定义


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

2、UML

ConcreteHandler1、ConcreteHandler2 :具体处理者类,处理它所负责的请求,可访问它的后继者,如果可处理该请求,就处理之,否则就将该请求转发给他的后继者。

3、职责链的好处

  • 关键在与当客户提交一个请求时,请求是沿着链传递直至由一个ConcreateHander对象负责处理它
  • 请求者不用管哪个对象来处理,反正该请求会被处理就是了
  • 接受者和发送者都没有对方的明确信息,且联众的对象自己也不知道链的结构。结果是职责链可简化对象的互相连接,它们仅需保持一个指向其后继者的引用,而不需要保持它所有的候选接受者的引用,大大降低了耦合度
  • 我们可以随时的增加或修改一个请求的结构,增强了给对象指派职责的灵活性

4、实例:

 请求类

package com.zcr.chain;
//申请
public class Request
{
    //申请类别
    private String requestType;

    //申请内容
    private String requestContent;

    //数量
    private int number;

    public String getRequestType()
    {
        return requestType;
    }

    public void setRequestType(String requestType)
    {
        this.requestType = requestType;
    }

    public String getRequestContent()
    {
        return requestContent;
    }

    public void setRequestContent(String requestContent)
    {
        this.requestContent = requestContent;
    }

    public int getNumber()
    {
        return number;
    }

    public void setNumber(int number)
    {
        this.number = number;
    }

}
package com.zcr.chain;

//管理者
public abstract class Manager
{
    protected String name;

    public Manager()
    {

    }

    //管理者的上级
    protected Manager superior;

    public Manager(String name)
    {
        this.name = name;
    }

    //设置管理者的上级
    public void SetSuperior(Manager superior)
    {
        this.superior = superior;
    }

    //申请请求
    abstract public void RequestApplications(Request request);
}
package com.zcr.chain;
//经理
public class Majordomo extends Manager
{

    public Majordomo(String name)
    {
        this.name = name;
    }

    @Override
    public void RequestApplications(Request request)
    {
        //经理所能有的权限就是可准许下属5天内的假期
        if(request.getRequestType().equals("请假") && request.getNumber() <= 5)
        {
            System.out.println(name+":"+request.getRequestContent()+"数量"+request.getNumber()+"被批准");
        }
        else
        {
            //其余的申请都需转到上级
            if(null != superior)
            {
                superior.RequestApplications(request);
            }
        }

    }

}
package com.zcr.chain;
//总经理
public class GeneralManager extends Manager
{

    public GeneralManager(String name)
    {
        this.name = name;
    }

    @Override
    public void RequestApplications(Request request)
    {
        //总经理允许任意时间假期
        if(request.getRequestType().equals("请假"))
        {
            System.out.println(name+":"+request.getRequestContent()+"数量"+request.getNumber()+"被批准");
        }
        else if(request.getRequestType().equals("加薪") && request.getNumber() <=500)
        {
            System.out.println(name+":"+request.getRequestContent()+"数量"+request.getNumber()+"被批准");
        }
        else if(request.getRequestType().equals("加薪") && request.getNumber() >500)
        {
            System.out.println(name+":"+request.getRequestContent()+"数量"+request.getNumber()+"再说把");
        }
    }

}
package com.zcr.chain;
//经理
public class CommonManager extends Manager
{

    public CommonManager(String name)
    {
        this.name = name;
    }

    @Override
    public void RequestApplications(Request request)
    {
        //经理所能有的权限就是可准许下属两天内的假期
        if(request.getRequestType().equals("请假") && request.getNumber() <= 2)
        {
            System.out.println(name+":"+request.getRequestContent()+"数量"+request.getNumber()+"被批准");
        }
        else
        {
            //其余的申请都需转到上级
            if(null != superior)
            {
                superior.RequestApplications(request);
            }
        }

    }

}
package com.zcr.chain;

public class ChainTest
{
    public static void main(String[] args)
    {
        CommonManager jinli = new CommonManager("经理");
        Majordomo zongjian = new Majordomo("总监");
        GeneralManager zongjingli = new GeneralManager("总经理");

        //设置上机,完全根据实际需求来更改设置
        jinli.SetSuperior(zongjian);
        zongjian.SetSuperior(zongjingli);

        Request request = new Request();
        request.setRequestType("请假");
        request.setRequestContent("XX来请假");
        request.setNumber(1);
        jinli.RequestApplications(request);

        //客户端的申请都是有“经理”发起,但实际上谁来决策由具体管理类来处理,客户端不知道
        Request request2 = new Request();
        request2.setRequestType("请假");
        request2.setRequestContent("XX来请假");
        request2.setNumber(4);
        jinli.RequestApplications(request2);

        Request request3 = new Request();
        request3.setRequestType("加薪");
        request3.setRequestContent("XX请求加薪");
        request3.setNumber(500);
        jinli.RequestApplications(request3);

        Request request4 = new Request();
        request4.setRequestType("加薪");
        request4.setRequestContent("XX请求加薪");
        request4.setNumber(1000);
        jinli.RequestApplications(request4);
    }
}

5、结果:

6、书籍推荐

  《大话设计模式》。上面的例子来自该书的改变,该书通过小菜和大鸟两人在生活中遇到的事情引出设计模式来解决问题,富有趣味性。读起来没那么枯燥无味。

时间: 2024-10-08 03:35:32

设计模式学习之职责链模式的相关文章

设计模式学习笔记--职责链模式

1 using System; 2 3 namespace ChainOfResponsibility 4 { 5 /// <summary> 6 /// 作者:bzyzhang 7 /// 时间:2016/6/1 6:54:00 8 /// 博客地址:http://www.cnblogs.com/bzyzhang/ 9 /// Handler说明:本代码版权归bzyzhang所有,使用时必须带上bzyzhang博客地址 10 /// </summary> 11 public ab

设计模式 ( 十二 ) 职责链模式(Chain of Responsibility)(对象行为)

 设计模式(十二)职责链模式(Chain of Responsibility)(对象行为型) 1.概述 你去政府部门求人办事过吗?有时候你会遇到过官员踢球推责,你的问题在我这里能解决就解决.不能解决就推卸给另外个一个部门(对象).至于究竟谁来解决问题呢?政府部门就是为了能够避免屁民的请求与官员之间耦合在一起,让多个(部门)对象都有可能接收请求,将这些(部门)对象连接成一条链,而且沿着这条链传递请求.直到有(部门)对象处理它为止. 样例1:js的事件浮升机制 样例2: 2.问题 假设有多个对象都有

设计模式(十二)职责链模式(Chain of Responsibility)(对象行为型)

1.概述 你去政府部门求人办事过吗?有时候你会遇到过官员踢球推责,你的问题在我这里能解决就解决,不能解决就推卸给另外个一个部门(对象).至于到底谁来解决这个问题呢?政府部门就是为了可以避免屁民的请求与官员之间耦合在一起,让多个(部门)对象都有可能接收请求,将这些(部门)对象连接成一条链,并且沿着这条链传递请求,直到有(部门)对象处理它为止. 例子1:js的事件浮升机制 例子2: 2.问题 如果有多个对象都有可能接受请求,如何避免避免请求发送者与接收者耦合在一起呢? 3.解决方案 职责链模式(Ch

大话设计模式Python实现-职责链模式

职责链模式(Chain Of Responsibility):使多个对象都有机会处理请求,从而避免发送者和接收者的耦合关系.将对象连成链并沿着这条链传递请求直到被处理 下面是一个设计模式的demo: 1 #!/usr/bin/env python 2 # -*- coding:utf-8 -*- 3 4 __author__ = 'Andy' 5 """ 6 大话设计模式 7 设计模式--职责链模式 8 职责链模式(Chain Of Responsibility):使多个对象

设计模式学习-责任链模式

1.定义 避免请求发送者与接收者耦合在一起,让多个对象都有可能接收请求,将这些对象连接成一条链,并且沿着这条链传递请求,直到有对象处理它为止. 2.类图 3.代码示例 1 package com.zhaoyangwoo.chainOfResponsibility; 2 3 /** 4 * Created by john on 16/6/16. 5 * 职责链模式,经费审批场景 6 */ 7 public class Responsibility { 8 9 public static void

设计模式入门之职责链模式Chain Of Responsibility

//职责链模式:使多个对象都有机会处理请求,从而避免请求的发送者和接受者之间的耦合关系.将这些对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止. //实例:申请费用的功能,不同金额的费用须要由不同的上级部分审核通过,假设下级没有审核的权限那么就让上级来进行审核 //上代码 //定义职责对象的接口 public abstract class Handler { protected Handler successor = null; public Handler(Handler su

设计模式-行为型-职责链模式

职责链模式(Chain of Responsibility): 在现实生活中,常常会出现这样的事例:一个请求需要多个对象处理,但每个对象的处理条件或权限不同.如公司员工报销差旅费,可审批的领导有部分负责人.副总经理.总经理等,但每个领导能审批的金额是不同的,不同的金额需要找相应的领导审批,也就是说要报销必须先搞清楚需要谁来审批.职责链模式就是为了解决这样的问题产生的. 职责链模式,又叫责任链模式.是为了避免请求发送者与多个请求处理者耦合在一起,将所有请求的处理者通过前一个对象记住其下一个对象的引

设计模式之职责链模式(JAVA实现)

学习netty框架时,看到有人说netty用到了设计模式的职责链模式,学习一下职责链模式,主要参考大话设计模式. 主要场景: 小菜想要加薪,向经理提出加薪请求,经理没有权限,经理交由总监处理,总监也没有权限,交由总经理处理,最后,总经理处理了,不同意. 职责链的意思就是,如果没有处理该类请求的权限,交由具有更高权限的对象处理.依次类推 这里将处理对象抽象为Handler类,经理.总监等为继承Handler的具体处理类,同时模拟客户端Client向Handler对象发出请求 类图如下 下面为具体代

Java设计模式之责任链模式、职责链模式

本文继续介绍23种设计模式系列之职责链模式. 什么是链 1.链是一系列节点的集合. 2..链的各节点可灵活拆分再重组. 职责链模式 使多个对象都有机会处理请求,从而避免请求的发送者和接受者之间的耦合关系, 将这个对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理他为止. 角色 抽象处理者角色(Handler):定义出一个处理请求的接口.如果需要,接口可以定义 出一个方法以设定和返回对下家的引用.这个角色通常由一个Java抽象类或者Java接口实现. 具体处理者角色(ConcreteHan