设计模式第七讲-责任链模式

栏目: 后端 · 发布时间: 6年前

内容简介:责任链模式的定义:使多个对象都有机会处理请求,从而避免请求的发送者和接受者之间的耦合关系将这个对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理他为止。责任链-根据事情大小来决定责任向上冒泡到谁身上

责任链模式的定义:使多个对象都有机会处理请求,从而避免请求的发送者和接受者之间的耦合关系

将这个对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理他为止。

图例

责任链-根据事情大小来决定责任向上冒泡到谁身上

设计模式第七讲-责任链模式

场景设置

如上图-DBA某人把线上数据库删了

不好的代码实现

package responsibility;

/**
 * 事故类
 */
public class Accident {

    //紧急程度
    private int fireLevel = 0;

    public Accident(int fireLevel) {
        this.fireLevel = fireLevel;
    }

    /**
     * 事件处理
     */
    public void fire() {

        if (this.fireLevel < 2) {
            System.out.println("运维组长处理了");
        } else if (this.fireLevel < 5) {
            System.out.println("CTO处理了");
        } else {
            System.out.println("BOSS处理了");
        }

    }

}
复制代码

调用(传入事件等级):

Accident accident = new Accident(3);
accident.fire();
复制代码

output:

CTO处理了
复制代码

使用责任链模式

首先设置下请求对象(方便调用传参):

package responsibility;

public class Request {

    private String requestMsg;

    private Integer requestLevel;

    public Request(String requestMsg, int requestLevel) {
        this.requestMsg = requestMsg;
        this.requestLevel = requestLevel;
    }

    public String getRequestMsg() {
        return this.requestMsg;
    }

    public Integer getRequestLevel() {
        return this.requestLevel;
    }

}
复制代码

设置基类handler

package responsibility;

public abstract class Handler {

    /**
     * 管理者名字
     */
    protected String name;

    /**
     * 管理者对象
     */
    protected Handler superior;


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

    //设置管理者上级
    public void SetHandler(Handler superior) {

        this.superior = superior;
    }

    //紧急请求
    abstract public void Fire(Request request);
}
复制代码

运维组长职能类

package responsibility;

public class OperationLeader extends Handler {

    public OperationLeader(String name) {
        super(name);
    }

    /**
     * 运维组长处理
     *
     * @param request
     */
    public void Fire(Request request) {
        if (request.getRequestLevel() < 2) {
            System.out.println(this.name + "处理了" + request.getRequestMsg());
        } else {
            if (this.superior != null) {
                this.superior.Fire(request);
            }
        }

    }
}
复制代码

CTO类

package responsibility;

public class CtoLeader extends Handler {

    public CtoLeader(String name) {
        super(name);
    }

    /**
     * CTO处理
     *
     * @param request
     */
    public void Fire(Request request) {
        if (request.getRequestLevel() < 5) {
            System.out.println(this.name + "处理了" + request.getRequestMsg());
        } else {
            if (this.superior != null) {
                this.superior.Fire(request);
            }
        }

    }
}
复制代码

大boss类

package responsibility;

public class Boss extends Handler {

    public Boss(String name) {
        super(name);
    }

    /**
     * CTO处理
     *
     * @param request
     */
    public void Fire(Request request) {

        System.out.println(this.name + "处理了" + request.getRequestMsg());

    }
}

复制代码

调用:

Request request = new Request("xx数据库被删了", 3);

        OperationLeader operationLeader = new OperationLeader("运维组长");
        CtoLeader ctoLeader = new CtoLeader("CTO");
        Boss boss = new Boss("野兽");

        //DBA上级
        operationLeader.SetHandler(ctoLeader);
        //运维组长上级
        ctoLeader.SetHandler(boss);
        //boss兜底

        //最先收到事故的为运维组长
        operationLeader.Fire(request);
复制代码

output:

Request request = new Request("xx数据库被删了", 3);

OperationLeader operationLeader = new OperationLeader("运维组长");
CtoLeader ctoLeader = new CtoLeader("CTO");
Boss boss = new Boss("野兽");

//DBA上级
operationLeader.SetHandler(ctoLeader);
//运维组长上级
ctoLeader.SetHandler(boss);
//boss兜底

//DBA最先报警
operationLeader.Fire(request);
复制代码

UML类图

设计模式第七讲-责任链模式

总结

优点:

  • 将请求的发送者和接受者解耦
  • 可以简化你的对象,因为它不需要知道链的结构
  • 通过改变链内的成员和次序,允许你动态的新增和删除责任

缺点:

  • 对象变得多了,相应对象管理比较复杂
  • 一个请求有可能末端都得不到处理,或者因为没有正确配置没有处理

更多精彩内容,欢迎关注热心的小宇公众号 (呆呆熊一点通):

设计模式第七讲-责任链模式

以上所述就是小编给大家介绍的《设计模式第七讲-责任链模式》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

与孩子一起学编程

与孩子一起学编程

[美] 桑德Warren Sande、Carter Sande / 苏金国、姚曜 等 / 人民邮电出版社 / 2010-11 / 65.00元

一本老少咸宜的编程入门奇书!一册在手,你完全可以带着自己的孩子,跟随Sande父子组合在轻松的氛围中熟悉那些编程概念,如内存、循环、输入和输出、数据结构和图形用户界面等。这些知识一点儿也不高深,听起来备感亲切,书中言语幽默风趣而不失真义,让学习过程充满乐趣。细心的作者还配上了孩子们都喜欢的可爱漫画和经过运行测试的程序示例,教你用最易编写和最易理解的Python语言,写出你梦想中的游戏程序。 ......一起来看看 《与孩子一起学编程》 这本书的介绍吧!

CSS 压缩/解压工具
CSS 压缩/解压工具

在线压缩/解压 CSS 代码

XML、JSON 在线转换
XML、JSON 在线转换

在线XML、JSON转换工具

RGB CMYK 转换工具
RGB CMYK 转换工具

RGB CMYK 互转工具