请选择 进入手机版 | 继续访问电脑版

HTML5星空

【Java设计模式教程】责任链模式

[复制链接]
发表于 2017-8-2 00:10:03 | 显示全部楼层 |阅读模式



尚学堂导读
 

责任链模式(Chain of Responsibility)是行为模式之一,该模式构造一系列分别担当不同职责的类的对象来共同完成一个任务,这些类的对象之间像链条一样紧密相连,所以被称作责任链模式。



应用场景


例1:比如客户要完成一个任务,这个任务包括a、b、c、d四个部分。

首先客户 Client 把任务交给 A,A 完成 a 部分之后,把任务交给B,B 完成 b 部分,…,直到 D 完成 d 部分。


例2:web 开发中的 filter 和 interceptor



UML类图



抽象处理者(Handler)角色:定义一个请求的接口。


如果需要可以定义个一个方法用来设定和返回下家对象的引用。


具体处理者(ConcreteHandler)角色:如果可以处理就处理请求,如果不能处理,就把请求传给下家,让下家处理。


也就是说它处理自己能处理的请求且可以访问它的下家。



Java实现


public abstract class Handler {

    protected Handler successor;

    public abstract void handlerRequest(String condition);

    public Handler getSuccessor() {
        return successor;
    }

    public void setSuccessor(Handler successor) {
        this.successor = successor;
    }

}

public class ConcreteHandler1 extends Handler {

    @Override
    public void handlerRequest(String condition) {
        System.out.println("ConcreteHandler1 handled ");
        if (successor !=null) {
            successor.handlerRequest(condition);
        }
    }
}

public class ConcreteHandler2 extends Handler {

    @Override
    public void handlerRequest(String condition) {
        System.out.println("ConcreteHandler2 handled ");
        if (successor !=null) {
            successor.handlerRequest(condition);
        }
    }
}

public class ConcreteHandler3 extends Handler {

    @Override
    public void handlerRequest(String condition) {
        System.out.println("ConcreteHandler3 handled ");
        if (successor !=null) {
            successor.handlerRequest(condition);
        }
    }
}

public class Client {
    public static void main(String[] args) {
        Handler handler1 = new ConcreteHandler1();
        Handler handler2 = new ConcreteHandler2();
        Handler handler3 = new ConcreteHandler3();

        //链起来
        handler1.setSuccessor(handler2);
        handler2.setSuccessor(handler3);

        handler1.handlerRequest("ConcreteHandler1");
    }

}


模式优缺点


优点:


1、降低耦合度。


职责链模式将请求处理细节(请求由哪些对象处理,怎样处理)跟客户端代码隔离开来,这些细节对客户端是透明的,客户端只需将相应的职责添加到链中即可,具体的处理过程交给责任链,降低了系统的耦合度。


2、增强了给对象指派职责的灵活性。


可以通过在运行时对职责链进行动态的增加或修改来改变处理一个请求的职责,职责链的维护是客户端负责的,所以增加或修改责任链不影响类库代码,非常灵活。


缺点:


1、不保证请求被接受。


由于责任链中的每个对象只处理自己感兴趣的请求,对于请求是否处理过并没有感知,这样容易导致请求没有对应的处理者。


当一个请求的责任链没有正确配置时也会导致该请求得不到处理。


2、由于责任链模式请求处理的不确定性,所以加大了程序调试的难度。



尚学堂--8月开班时间

Java--零基础入门就业班


开课时间:

2017年08月08日、

8月15日、8月22日   

抢座中..


电话:029-62258374  

地址:陕西省西安市高新区科技二路西安软件园天泽大厦五楼


免费公开课

每周二、四、六

周二周四公开课下午两点开始

周六公开课早上九点开始

在公众号主页发送【试听】获取免费听课名额


尚学堂Java培训


海量 IT 编程资料供您享用






点击下方"阅读原文"获取免费听课名额


回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

快讯
发布主题 快速回复 返回列表

     京ICP备14042305号

html5star team © 2012-2013 html5星空 Comsenz Inc.

GMT+8, 2018-12-14 04:37 , Processed in 0.176391 second(s), 37 queries .

快速回复 返回顶部 返回列表