`
zhangweieye
  • 浏览: 9773 次
  • 性别: Icon_minigender_1
  • 来自: 长沙
社区版块
存档分类
最新评论

设计模式学习笔记(六:责任链模式)

 
阅读更多

1.1概述

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

    责任链模式是使用多个对象处理用户请求的成熟模式,责任链模式的关键是将用户的请求分派给许多对象,这些对象被组织成一个责任链,即每个对象含有后继对象的引用,并要求责任链上的每个对象,如果能处理用户的请求,就做出处理,不再将用户的请求传递给责任链上的下一个对象;如果不能处理用户的请求,就必须将用户的请求传递给责任链上的下一个对象。

 

 

1.2模式的结构

责任链模式的结构总包括两种角色:

(1)处理者(Handler):处理者是一个接口,负责规定具体处理者处理用户请求的方法,以及具体处理者设置后继对象的方法。

(2)具体处理者(ConcreteHandler):具体处理者是实现处理者接口的类的实例。具体处理者通过调用处理者接口规定的方法处理用户的请求,即在接到用户的请求后,处理者将调用接口规定的方法,在执行该方法的过程中,如果发现能处理用户的请求,就处理有关数据,否则就反馈无法处理的信息给用户,然后将用户的请求传递给自己的后继对象。

责任链模式结构的类图如下所示:

 

 

 

1.3责任链模式的优点

(1)责任链中的对象只和自己的后继是低耦合关系,和其他对象毫无关联,这使得编写处理者对象以及创建责任链变得非常容易。

(2)当在处理者中分配职责时,责任链给应用程序更多的灵活性。

(3)应用程序可以动态地增加、删除处理者或重新指派处理者的职责。

(4)
应用程序可以动态地增加、删除处理者或重新指派处理者的职责。

(5)应用程序可以动态地改变处理者之间的先后顺序。

(6)使用责任链的用户不必知道处理者的信息,用户不会知道到底是哪个对象处理了它的请求。

 

1.4适合使用责任链模式的情景

(1)有许多对象可以处理用户的请求,希望程序在运行期间自动确定处理用户的那个对象。

(2)希望用户不必明确指定接受者的情况下,向多个接受者的一个提交请求。

(3)程序希望动态制定可处理用户请求的对象集合。

 

 

1.5责任链模式的使用

以下通过一个简单的问题来描述责任链模式汇总所涉及的各个角色。

用户提交一个个人身份证号码,想知道该人是否在北京、上海或天津居住。

针对上述问题,使用责任链模式设计一个系统来处理用户的请求。具体如下:

首先看一下本实例构建框架具体类和1.2模式的结构中类图的对应关系,如下图所示:

 

 

 

(1)处理者(Handler

本问题中,处理者(Handler)接口的名字是Handler,代码如下:

复制代码
package com.liuzhen.six_chainOfResponsibility;

public interface Handler {
    public abstract void handleRequest(String number);
    public abstract void setNextHandler(Handler handler);
}
复制代码

 

(2)具体处理者

对于本问题,一共有三个负责创建具体处理者的类,分别是BeijingShanghaiTianjing,三个类的代码如下:

Beijing.java类:

复制代码
package com.liuzhen.six_chainOfResponsibility;

import java.util.ArrayList;

public class Beijing implements Handler{
    private Handler handler;                //存放当前处理者后继的Handler接口变量
    private ArrayList<String> numberList;   //存放身份证号码的数组线性表
    Beijing(){
        numberList = new ArrayList<String>();
        numberList.add("123456789");        //这里使用模拟的身份证号码
        numberList.add("987654321");
        numberList.add("987212143");
        numberList.add("767734672");
    }
    public void handleRequest(String number){
        if(numberList.contains(number))
            System.out.println("该人在北京居住");
        else{
            System.out.println("该人不在北京居住");
            if(handler != null)
                handler.handleRequest(number);   //将请求传递给下一个处理者
        }
    }
    public void setNextHandler(Handler handler){
        this.handler = handler;
    }
}
复制代码

Shanghai.java类:

复制代码
package com.liuzhen.six_chainOfResponsibility;

import java.util.ArrayList;

public class Shanghai implements Handler{
    private Handler handler;                //存放当前处理者后继的Handler接口变量
    private ArrayList<String> numberList;   //存放身份证号码的数组线性表
    Shanghai(){
        numberList = new ArrayList<String>();
        numberList.add("234567891");        //这里使用模拟的身份证号码
        numberList.add("876543219");
        numberList.add("872121493");
        numberList.add("767734729");
    }
    public void handleRequest(String number){
        if(numberList.contains(number))
            System.out.println("该人在上海居住");
        else{
            System.out.println("该人不在上海居住");
            if(handler != null)
                handler.handleRequest(number);   //将请求传递给下一个处理者
        }
    }
    public void setNextHandler(Handler handler){
        this.handler = handler;
    }

}
复制代码

Tianjing.java类:

复制代码
package com.liuzhen.six_chainOfResponsibility;

import java.util.ArrayList;

public class Tianjing implements Handler{
    private Handler handler;                //存放当前处理者后继的Handler接口变量
    private ArrayList<String> numberList;   //存放身份证号码的数组线性表
    Tianjing(){
        numberList = new ArrayList<String>();
        numberList.add("345678912");        //这里使用模拟的身份证号码
        numberList.add("886543219");
        numberList.add("972121493");
        numberList.add("667734729");
    }
    public void handleRequest(String number){
        if(numberList.contains(number))
            System.out.println("该人在天津居住");
        else{
            System.out.println("该人不在天津居住");
            if(handler != null)
                handler.handleRequest(number);   //将请求传递给下一个处理者
        }
    }
    public void setNextHandler(Handler handler){
        this.handler = handler;
    }
}
复制代码

 

(3)具体使用

    通过SixApllication类来具体实现上述相关类和接口,来实现适配器模式的运用,其代码如下:

复制代码
package com.liuzhen.six_chainOfResponsibility;

public class SixApplication {
    private Handler beijing,shanghai,tianjing;      //责任链上的对象
    public void createChain(){                      //建立责任链
        beijing = new Beijing();
        shanghai = new Shanghai();
        tianjing = new Tianjing();
        beijing.setNextHandler(shanghai);
        shanghai.setNextHandler(tianjing);
    }
    public void reponseClient(String number){      //响应用户的请求
        beijing.handleRequest(number);
    }
    public static void main(String args[]){
        SixApplication sixApplicaiton = new SixApplication();
        sixApplicaiton.createChain();
        sixApplicaiton.reponseClient("667734729");
    }
}
复制代码

 

运行结果:

该人不在北京居住
该人不在上海居住
该人在天津居住
分享到:
评论

相关推荐

    HeadFirst设计模式学习笔记

    《HeadFirst设计模式学习笔记》是一份详尽的资料,旨在帮助读者深入理解并掌握设计模式这一编程领域的核心概念。设计模式是软件工程中的一种最佳实践,它在解决常见问题时提供了一种标准的解决方案,使得代码更易于...

    23种设计模式学习笔记

    这个“23种设计模式学习笔记”文档将引导你深入理解这些模式,并帮助你在实际编程中有效地应用它们。以下是对23种设计模式的详细解读: 1. **单例模式**:确保一个类只有一个实例,并提供全局访问点。它常用于控制...

    23种设计模式学习笔记及源码

    这个压缩包文件包含了23种设计模式的学习笔记和源码,旨在帮助开发者深入理解并熟练运用这些模式。以下是对每种设计模式的详细解释,以及它们在Java编程中的应用。 1. **单例模式**:确保一个类只有一个实例,并...

    设计模式学习笔记

    1. 责任链模式(Chain of Responsibility):将请求沿着处理者链传递,直到有对象处理为止。 2. 命令模式(Command):将请求封装为一个对象,以便使用不同的请求、队列请求或支持撤销操作。 3. 解释器模式...

    C#设计模式学习笔记

    C#设计模式学习笔记是一份详尽的资源,适合任何希望深入了解如何在C#编程中应用设计模式的开发者。这份笔记涵盖了多种设计模式,旨在提升代码的可读性、可维护性和可扩展性,这些都是软件开发中至关重要的要素。 ...

    设计模式之美—学习笔记

    在这个“设计模式之美”的学习笔记中,我们将探讨一些主要的设计模式,以及它们在实际开发中的应用。 首先,我们从创建型模式开始。这类模式主要用于对象的创建,如单例模式(Singleton)、工厂模式(Factory ...

    GoF 23种设计模式学习笔记

    "GoF 23种设计模式学习笔记" 是一个深入探讨这23个经典设计模式的资源,这些模式最初由Erich Gamma、Richard Helm、Ralph Johnson和John Vlissides四位作者在1994年的著作《设计模式:可复用面向对象软件的基础》中...

    尚硅谷设计模式源码笔记课件.zip

    行为型模式:模版方法模式、命令模式、访问者模式、迭代器模式、观察者模式、中介者模式、备忘录模式、解释器模式(Interpreter模式)、状态模式、策略模式、职责链模式(责任链模式) 2) 学习目标:通过学习,学员...

    HeadFirst 设计模式学习笔记3--装饰模式 Demo

    在“HeadFirst 设计模式学习笔记3--装饰模式 Demo”中,作者通过实例讲解了装饰模式的基本概念、结构和应用场景。这篇文章可能是从CSDN博客平台上的一个链接访问的,遗憾的是,由于我们当前无法直接访问该链接,所以...

    设计模式笔记

    - 责任链模式:将请求沿着处理者链进行传递,直到某个处理者处理请求。 - 命令模式:将请求封装为一个对象,以便使用不同的请求、队列请求,或者支持可撤销的操作。 - 解释器模式:定义一个语言的文法,并提供一...

    《设计模式》学习笔记

    ### 设计模式学习笔记 #### 引言 设计模式(Design Patterns)是在软件设计领域内广泛应用的一种实践指南,它提供了一系列解决常见问题的方案。设计模式可以被理解为面向对象软件设计的经验总结,是对特定面向对象...

    300Java设计模式部分学习笔记

    1. 责任链模式(Chain of Responsibility Pattern):使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系。 2. 迭代器模式(Iterator Pattern):提供一种方法顺序访问一个聚合对象中的各个...

    根据《JAVA与设计模式》整理的笔记及示例代码

    1. 责任链模式:避免将请求的发送者和接收者耦合在一起,使得多个对象都有可能处理请求。 2. 命令模式:将请求封装为一个对象,以便使用不同的请求、队列请求,或者支持可撤销的操作。 3. 解释器模式:给定一个语言...

    23中设计模式学习笔记.docx

    ### 23种设计模式学习笔记 #### 一、软件设计模式的概念与意义 **概念:** 软件设计模式(Software Design Pattern),又称设计模式,是一套被广泛采用、经过整理和分类的代码设计经验总结。它针对软件设计过程中...

    #资源大人分享计划# 设计模式学习笔记.rar

    在这个“#资源大人分享计划# 设计模式学习笔记.rar”压缩包中,我们可以期待找到一系列关于设计模式的详细学习资料,包括定义、类图、代码示例以及各种使用场景,这些都将帮助我们深入理解并掌握设计模式。...

    Android-Java的常见集中设计模式学习笔记

    本学习笔记主要聚焦于Java中的常见设计模式,并将这些概念与Android开发实践相结合。 1. **单例模式**:在Android中,单例模式常用于创建全局唯一的对象,例如应用程序的Application类就是一个典型的单例,它在整个...

    Java 版设计模式学习笔记-java-design-patterns.zip

    这个“Java版设计模式学习笔记”涵盖了多种设计模式,旨在帮助开发者更好地理解和应用这些模式。让我们深入探讨一下其中可能包含的关键知识点。 一、单例模式 单例模式确保一个类只有一个实例,并提供一个全局访问...

    台湾人写的设计模式笔记

    通过阅读这份笔记,读者不仅可以学习到设计模式的基本概念,还能了解到如何在Java环境中实际运用这些模式,提升编程技能。设计模式的学习和掌握是成为一名优秀程序员的必经之路,它们能帮助我们写出更高效、更灵活、...

    23种设计模式的解析与Cpp实现

    - 责任链模式(Chain of Responsibility):将请求沿链传递,直到某个对象处理它。 - 命令模式(Command):将命令封装为一个对象,以便使用不同的请求、队列请求或支持撤销操作。 - 解释器模式(Interpreter):...

    23个设计模式图解--学习笔记

    在《23个设计模式图解--学习笔记》中,我们探讨了这些模式,以便于理解和应用到实际开发中。以下是这23个设计模式的详细说明: 1. **工厂方法**(Factory Method):定义一个用于创建对象的接口,让子类决定实例化...

Global site tag (gtag.js) - Google Analytics