Java设计模式--责任链模式

责任链模式

使多个对象都有机会都有机会处理请求,从而避免请求的发送者和接受者之间的耦合关系。将这些对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止。

Chain of Responsibility Pattern

A void coupling the sender of a request to its receiver by giving more than one object a chance to handle the request. Chain the receiving objects and pass the request along the chain until an object handles it.

类图

模式的结构与使用

责任链模式的结构中包括两种角色。
+ 处理者(Handler):处理者是一个接口,负责规定具体处理者处理用户请求的方法以及具体处理者设置后继对象的方法。
+ 具体处理者(Concrete Handler):具体处理者是实现处理者的类的实例。具体处理者通过调用处理者接口规定的方法处理用户的请求,即在接到用户的请求后,处理者将调用接口规定的方法,在执行该方法的过程中,如果发现能处理用户的请求,就处理有关数据,否则就反馈无法处理的信息给用户,然后将用户的请求传递给自己的后继对象。

简单的例子

Handler的抽象类Handler.java

package Handler;

public interface Handler {
    public abstract void handleRequest(String number);
    public abstract void setHandler(Handler handler);
}

ConcreteHandler的实现类Beijing.java

package Handler;

import java.util.ArrayList;

public class Beijing implements Handler {

    private Handler handler;
    private ArrayList<String> numberList;

    public Beijing() {
        numberList = new ArrayList<String>();
        numberList.add("11029812340930034");
        numberList.add("11029812340930033");
        numberList.add("11029812340930032");
        numberList.add("11029812340930031");
        numberList.add("11029812340930030");
    }

    @Override
    public void handleRequest(String number) {
        if (numberList.contains(number)) {
            System.out.println("该人在北京住");
        } else {
            System.out.println("该人不在北京住");
            if (handler!=null) {
                handler.handleRequest(number);
            }
        }
    }

    @Override
    public void setHandler(Handler handler) {
        this.handler = handler;
    }
}

ConcreteHandler的实现类Shanghai.java

package Handler;

import java.util.ArrayList;

public class Shanghai implements Handler {

    private Handler handler;
    private ArrayList<String> numberList;

    public Shanghai() {
        numberList = new ArrayList<String>();
        numberList.add("12029812340930034");
        numberList.add("12029812340930033");
        numberList.add("12029812340930032");
        numberList.add("12029812340930031");
        numberList.add("12029812340930030");
    }

    @Override
    public void handleRequest(String number) {
        if (numberList.contains(number)) {
            System.out.println("该人住在上海");
        } else {
            System.out.println("该人不住在上海");
            if (handler!=null) {
                handler.handleRequest(number);
            }
        }
    }

    @Override
    public void setHandler(Handler handler) {
        this.handler = handler;
    }
}

测试类Application.java

package Handler;

public class Application {
    private Handler beijing,shanghai;

    public void createChain() {
        beijing = new Beijing();
        shanghai = new Shanghai();
        beijing.setHandler(shanghai);
    }

    public void reponseClient(String number) {
        beijing.handleRequest(number);
    }

    public static void main(String[] args) {
        Application application = new Application();
        application.createChain();
        application.reponseClient("12029812340930034");
    }

}

责任链模式的优点

  • 责任链中的对象只和自己的后继是低耦合关系,和其他对象毫无关联,这使得编写处理者对象以及创建责任链变得非常容易。
  • 当在处理者中分配职责时,责任链给应用程序更多的灵活性。
  • 应用程序可以动态地增加、删除处理者或重新指派处理者的职责。
  • 应用程序可以动态地改变处理者之间的先后顺序。
  • 使用责任链的用户不必知道处理者的信息,用户不会知道到底是哪个对象处理了它的请求。

适用责任链模式的情景

  • 有许多对象可以处理用户的请求,希望程序在运行期间自动确定处理用户的那个对象。
  • 希望用户不必明确指定接受者的情况下,向多个接受者的一个提交请求。
  • 程序希望动态制定可处理用户请求的对象集合。

下载源码请到

MyGitHub

时间: 2024-09-20 05:50:54

Java设计模式--责任链模式的相关文章

深入浅出基于Java的责任链模式

一.引言 初看责任链模式,心里不禁想起了一个以前听过的相声:看牙.说的是一个病人看牙的时候,医生不小心把拔下的一个牙掉进了病人嗓子里.病人因此楼上楼下的跑了好多科室,最后无果而终. 责任链模式就是这种"推卸"责任的模式,你的问题在我这里能解决我就解决,不行就把你推给另一个对象.至于到底谁解决了这个问题了呢?我管呢! 二.定义与结构 从名字上大概也能猜出这个模式的大概模样--系统中将会存在多个有类似处理能力的对象.当一个请求触发后,请求将在这些对象组成的链条中传递,直到找到最合适的&qu

13、Python与设计模式--责任链模式

一.请假系统 假设有这么一个请假系统:员工若想要请3天以内(包括3天的假),只需要直属经理批准就可以了:如果想请3-7天,不仅需要直属经理批准,部门经理需要最终批准:如果请假大于7天,不光要前两个经理批准,也需要总经理最终批准.类似的系统相信大家都遇到过,那么该如何实现呢?首先想到的当然是if-else-,但一旦遇到需求变动,其臃肿的代码和复杂的耦合缺点都显现出来.简单分析下需求,"假条"在三个经理间是单向传递关系,像一条链条一样,因而,我们可以用一条"链"把他们进

设计模式之禅之设计模式-责任链模式

一:责任链模式的定义        --->使多个对象都有机会处理请求,从而避免了请求的发送者和接受者之间的耦合关系.将这些对象连成一条链,并沿着这条链传递该请求,直到有对象处理它为止.        --->责任链模式的重点是在"链"上,由一条链去处理相似的请求在链中决定谁来处理这个请求,并返回相应的结果        --->一般会有一个封装类对责任模式进行封装,也就是替代Client类,直接返回链中的第一个处理者,具体链的设置不需要高层次模块关系,这样,更简化了

实例讲解Java的设计模式编程中责任链模式的运用_java

定义:使多个对象都有机会处理请求,从而避免了请求的发送者和接收者之间的耦合关系.将这些对象连成一条链,并沿着这条链传递该请求,直到有对象处理它为止.类型:行为类模式类图: 首先来看一段代码: public void test(int i, Request request){ if(i==1){ Handler1.response(request); }else if(i == 2){ Handler2.response(request); }else if(i == 3){ Handler3.r

Java设计模式编程中的责任链模式使用示例_java

责任链模式:多个对象由其对象对应下家的引用连成一条链,请求在这个链上传递,直到 链上的某一个接收对象处理此请求.因为请求的客户端并不知道链上最终是谁来处理这个请求,使得系统可以在不影响客户端的情况下动态地重新组织和分配责任, 从而避免了请求发送者与请求处理者之间的耦合. 责任链械中涉及到三种角色: 1,抽象处理者角色 2,具体处理者角色 3,请求发送者 小例子:假设去买房子,买房子就需要砍价, 卖房的人职位不同,可以优惠的价格也不同,不同职位就可以形成一个处理请求的链.我们暂定: * 基层销售员

Java设计模式之责任链模式简介_java

对于使用过宏的朋友应该知道,利用宏可以实现一个键绑定多个技能.例如如果排在前面的技能有CD,则跳过此技能,执行之后的技能.记得曾经玩DK,打怪的时候,就是用一个键,一直按就行了.在servlet里的doGet和doPost方法,我们一般都把doGet请求发动到doPost里来处理,这也是一种责任链的模式. 这里,有个宏,绑定了"冰血冷脉"和"寒冰箭"两个技能,程序实例如下所示: package responsibility; /** * DOC 技能接口,要绑定的技

轻松掌握java责任链模式_java

定义:责任链模式(Chain of Responsibility Pattern)为请求创建了一个接收者对象的链.这种模式给予请求的类型,对请求的发送者和接收者进行解耦.这种类型的设计模式属于行为型模式.在这种模式中,通常每个接收者都包含对另一个接收者的引用.如果一个对象不能处理该请求,那么它会把相同的请求传给下一个接收者,依此类推. 特点:1.降低耦合度.它将请求的发送者和接收者解耦.              2.简化了对象.使得对象不需要知道链的结构.              3.增强给

跟屌丝学设计模式之责任链模式

JAVA之责任链模式 原文地址:http://itzyx.com/index.php/java_zrl/ 在阎宏博士的<JAVA与模式>一书中开头是这样描述责任链(Chain of Responsibility)模式的:  责任链模式是一种对象的行为模式.在责任链模式里,很多对象由每一个对象对其下家的引用而连接起来形成一条链.请求在这个链上传递,直到链上的某一个对象决定处理此请求.发出这个请求的客户端并不知道链上的哪一个对象最终处理这个请求,这使得系统可以在不影响客户端的情况下动态地重新组织和

java责任链模式如何保证其线程安全性?

问题描述 java责任链模式如何保证其线程安全性? java责任链模式如何保证其线程安全性?还有一个问题是如何保证多个线程之间的顺序执行? 解决方案 JAVA中责任链模式java责任链模式 解决方案二: 无论什么模式,只要对静态的成员做好线程同步,对线程不安全的方法,做好同步,都可以改造成多线程的代码. 同步代码的方法无非就是锁.临界区.监视器.信号量. 解决方案三: synchronized是一个方法