返回首页
当前位置: 主页 > 编程语言 > JAVA教程 >

Java设计模式-责任链模式(Chain of Responsibility)

时间:2016-09-23 20:27来源:电脑教程学习网 www.etwiki.cn 编辑:admin

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

一、应用场景:

例1:比如客户要完成一个任务,这个任务包括a,b,c,d四个部分。 首先客户Client把任务交给A,A完成a部分之后,把任务交给B,B完成b部分,…,直到D完成d部分。
例2:web开发中的filter和interceptor

二、UML类图
 

UML类图
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、由于责任链模式请求处理的不确定性,所以加大了程序调试的难度。

------分隔线----------------------------
标签(Tag):Java设计模式 责任链模式
------分隔线----------------------------
推荐内容
  • IDEA初始化配置 图解教程

    使用JetBrains IDEA已经两个月了,今天给我自动升级了,但是一直报一个错误(大致就是...

  • java中数组转为列表的几种方法

    java中数组转为集合List,是很基础常见的,日常开发中也经常会用到,今天整理了下,有...

  • java常用设计模式-策略设计模式

    java中常用的设计模式如单例模式、原型模式,这在之前的2篇文章中已经说明,还有代理...

  • Java开发规范

    编码规范就如同协议,有了Http、TCP等各种协议,计算机之间才能有效地通信,同样的,...

  • java泛型那些事

    泛型的类型安全性 有许多原因促成了泛型的出现,而最引人注意的一个原因,就是为了创...

  • HdfsSink原理解析

    我们先了解几个概念: batchSize sink从channel中取batchSize数量的event才会flush,sy...

猜你感兴趣