设计模式(十八)责任链模式

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

内容简介:责任链模式是一种对象的行为模式。在责任链模式里,很多对象由每一个对象对其下家的引用而连接起来形成一条链。请求在这个链上传递,直到链上的某一个对象决定处理此请求。发出这个请求的客户端并不知道链上的哪一个对象最终处理这个请求,这使得系统可以在不影响客户端的情况下动态地重新组织和分配责任。责任链模式涉及到的角色如下所示:1 抽象处理者(Handler)角色:定义出一个处理请求的接口。如果需要,接口可以定义 出一个方法以设定和返回对下家的引用。 2 具体处理者(ConcreteHandler)角色:具体处理者接到请

责任链模式是一种对象的行为模式。在责任链模式里,很多对象由每一个对象对其下家的引用而连接起来形成一条链。请求在这个链上传递,直到链上的某一个对象决定处理此请求。发出这个请求的客户端并不知道链上的哪一个对象最终处理这个请求,这使得系统可以在不影响客户端的情况下动态地重新组织和分配责任。

责任链模式涉及到的角色如下所示:

1 抽象处理者(Handler)角色:定义出一个处理请求的接口。如果需要,接口可以定义 出一个方法以设定和返回对下家的引用。 2 具体处理者(ConcreteHandler)角色:具体处理者接到请求后,可以选择将请求处理掉,或者将请求传给下家。由于具体处理者持有对下家的引用,因此,如果需要,具体处理者可以访问下家。

举一个简单的例子,部门办活动需要报销。报销处职员可以处理单次500元以下的业务,超过500需要和处长联系。而处长只能处理单次1000元一下的业务,再高就只能找老大报了。但是老大目前只能处理单次1500元以下的业务,再高目前只能拒绝报销了。

这个例子的具体实现为:

抽象类Handler

public abstract class Handler {
    protected Handler nextHandler = null;

    public Handler getNextHandler() {
        return nextHandler;
    }

    public void setNextHandler(Handler nextHandler) {
        this.nextHandler = nextHandler;
    }
    
    public abstract String dispose(String user , double fee);
}
复制代码

职员类:

public class StaffMember extends Handler {

    @Override
    public String dispose(String user, double fee) {
        if(fee < 500){
            System.out.println("职员 给了 "+user+" "+fee+"元");
        }else if (super.getNextHandler() == null){
            System.out.println("谁都处理不了 "+user+" 要 "+fee+"元的事情");
        }else {
            super.getNextHandler().dispose(user,fee);
        }
        return null;
    }
}
复制代码

处长类:

public class SectionChief extends Handler {
    @Override
    public String dispose(String user, double fee) {
        if(fee < 1000){
            System.out.println("小主管 给了 "+user+" "+fee+"元");
        }else if (super.getNextHandler() == null){
            System.out.println("谁都处理不了 "+user+" 要 "+fee+"元的事情");
        }else {
            super.getNextHandler().dispose(user,fee);
        }
        return null;
    }
}
复制代码

老大类:

public class Director extends Handler {
    @Override
    public String dispose(String user, double fee) {
        if(fee < 5000){
            System.out.println("老大 给了 "+user+" "+fee+"元");
        }else if (super.getNextHandler() == null){
            System.out.println("谁都处理不了 "+user+" 要 "+fee+"元的事情");
        }else {
            super.getNextHandler().dispose(user,fee);
        }
        return null;
    }
}
复制代码

Main方法:

public class Main {
    public static void main(String[] args){
        StaffMember staffMember = new StaffMember();
        SectionChief sectionChief = new SectionChief();
        Director director = new Director();

        //set Handler
        staffMember.setNextHandler(sectionChief);
        sectionChief.setNextHandler(director);

        staffMember.dispose("小王",400);
        staffMember.dispose("小混混",800);
        staffMember.dispose("老李",1200);

        staffMember.dispose("小明",10000);
    }
}
复制代码

最后的结果就是:

设计模式(十八)责任链模式

纯责任链模式和不纯的责任链模式

如果一个类要么承担责任处理请求要么将请求踢给下一个皮球,则被称为纯责任链模式。

如果一个类承担了一部分责任,还将请求踢给下一个皮球,则被称为不纯的责任链模式。

note:把一本书读厚,然后再读薄


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

查看所有标签

猜你喜欢:

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

iOS应用逆向工程 第2版

iOS应用逆向工程 第2版

沙梓社、吴航 / 机械工业出版社 / 2015-4-1 / 79.00

你是否曾因应用上线的第一天即遭破解而无奈苦恼,想要加以防范,却又束手无策? 你是否曾为某一应用深深折服,想要借鉴学习,却又无从下手? 你是否已不满足于public API,想要进军Cydia开发,却又求学无门? 你是否已产生“不识Apple真面目,只缘身在App Store中”的危机感,想要通过阅读来一窥这冰山一角外的整个北极,却又找不到合适的书? 你是否已经因无法跨越开发......一起来看看 《iOS应用逆向工程 第2版》 这本书的介绍吧!

HTML 压缩/解压工具
HTML 压缩/解压工具

在线压缩/解压 HTML 代码

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

在线压缩/解压 CSS 代码

Markdown 在线编辑器
Markdown 在线编辑器

Markdown 在线编辑器