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

说明

定义:

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

UML图:

包含角色:

1)Handler:抽象处理着;

2)ConcreteHandler:具体处理者。

代码实现:

典型的"抽象处理者"代码

// 典型的"抽象处理者"代码
abstract class Handler {
    // 为了使得handler之间连接起来像一个链,这里用来存储下处理者
    protected Handler successor;

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

    public abstract void handleRequest(String request);
}

典型的"具体处理者"代码

// 典型的"具体处理者"代码
class ConcreteHandler extends  Handler{
    @Override
    public void handleRequest(String request) {
        // 场景1)自己满足处理条件,就不往下流转;自己不满足处理条件,就往下流转
        if(满足条件){
            //1)处理
        }else{
            //2) 交给其他处理者处理
            this.successor.handleRequest(request);
        }

        // 场景2)当然也可能是自己处理完,之后又交给下一个处理者处理
        //1)当前处理
        //2)交个下一个处理者处理
        this.successor.handleRequest(request);

    }
}

注意:

handleReuqest方法内部具体场景可以根据自己实际需求而定:

场景1)自己满足处理条件,就不往下流转;自己不满足处理条件,就往下流转
场景2)当然也可能是自己处理完,之后又交给下一个处理者处理

典型客户端调用代码:

Handler handler1=new ConcreteHandler1();
Handler handler2=new ConcreteHandler2();
Handler handler3=new ConcreteHandler3();

// 创建职责链
handler1.setSuccessor(handler2);
handler2.setSuccessor(handler3);

// 发送请求,请求对象通常为根据需求而定。
handler1.handleRequest("xxx");

Java Web Servlet Filter职责链应用

filter/servlet/filterChain定义:

定义“处理者抽象管理者”

// 首先定义一个 过滤器链接口,包含一个doFilter方法
interface IFilterChain {
    void doFilter();
}

定义“抽象处理类者”

// Filter接口类,包含一个doFilter方法,方法包含一个FilterChain参数
interface IFilter {
    void doFilter(IFilterChain chain);
}

定义“处理者具体管理者”扩展业务接口:

// Servlet接口类,包含一个servcie方法
interface IServlet {
    void service();
}

业务接口具体实现:

class MyServlet implements IServlet {
    @Override
    public void service() {
        System.out.println("MyServlet#service()");
    }
}

定义2个“处理者”

class MyFilter1 implements IFilter {
    @Override
    public void doFilter(IFilterChain chain) {
        System.out.println("MyFilter1#doFilter() before");
        chain.doFilter();
        System.out.println("MyFilter1#doFilter() after");
    }
}

class MyFilter2 implements IFilter {
    @Override
    public void doFilter(IFilterChain chain) {
        System.out.println("MyFilter2#doFilter() before");
        chain.doFilter();
        System.out.println("MyFilter2#doFilter() after");
    }
}

一个处理者处理完交给下一个处理者处理。

处理者管理类实现:

class MyFilterChain implements IFilterChain {
    private int pos = 0; // 标记filter执行索引位置
    private int n = 0; // 已经拥有的filter个数
    private IServlet servlet; // 存储 当前servlet
    private List<IFilter> filters = new ArrayList<>(); // 存储过滤器

    public void addFilter(IFilter filter) {
        this.filters.add(filter);
        n++;
    }

    public void setServlet(IServlet servlet) {
        this.servlet = servlet;
    }

    // 责任链的核心方法,执行filter到最底一层后调用 servlet#service 方法。
    @Override
    public void doFilter() {
        // Call the next filter if there is one
        if (pos < n) {
            IFilter filter = filters.get(pos++);
            filter.doFilter(this);

            return;
        }

        servlet.service();
    }
}

客户端调用:

import java.util.ArrayList;
import java.util.List;

public class FilterTest {
    public static void main(String[] args) {
        MyFilterChain filterChain = new MyFilterChain();
        filterChain.addFilter(new MyFilter1());
        filterChain.addFilter(new MyFilter2());
        filterChain.setServlet(new MyServlet());

        filterChain.doFilter();
    }
}

执行结果:

MyFilter1#doFilter() before
MyFilter2#doFilter() before
MyServlet#service()
MyFilter2#doFilter() after
MyFilter1#doFilter() after

原文地址:https://www.cnblogs.com/yy3b2007com/p/12219729.html

时间: 2024-10-08 23:54:36

设计模式(九)责任链(Chain of Responsibility)的相关文章

Java 实现责任链(Chain of Responsibility)模式

类图 /** * 抽象责任 * @author stone * */ public abstract class IFilter { private IFilter successor; public IFilter getSuccessor() { return successor; } public void setSuccessor(IFilter successor) { this.successor = successor; } public abstract void handleF

C++设计模式实现--职责链(Chain of Responsibility)模式

一. 概述 职责链模式: 使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系.将这些对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止. 二. 举个例子 员工要求加薪 公司的管理者一共有三级:总经理.总监.经理,如果一个员工要求加薪,应该向主管的经理申请,如果加薪的数量在经理的职权内,那么经理可以直接批准,否则将申请上交给总监.总监的处理方式也一样,总经理可以处理所有请求.这就是典型的职责链模式,请求的处理形成了一条链,直到有一个对象处理请求. 结构图如下: 假

c++ 行为型模式-责任链(Chain of Responsibility)

1) 意图 使多个对象连成一条链,沿着这条链传递请求,直到有个对象处理它为止. 2) 结构 其中: Handler定义一个处理请求的接口 ConcreteHandler处理它所负责的请求 Client向链上具体处理提交请求 3) 适用性 有多个对象可以处理一个请求,哪个对象处理该请求运行时刻自动确定 想在不明确指定接收者的情况下向多个对象中的一个提交一个请求 可处理一个请求的对象集合应被动态指定 4) 举例 1 #include <iostream> 2 #include <list&g

20 关卡设计-责任链(Chain of Responsibility)

1 /// <summary> 2 /// 处理信息的接口 3 /// </summary> 4 public abstract class Handler { 5 6 /// <summary> 7 /// 下一个请求接收者 8 /// </summary> 9 protected Handler m_NextHandler = null; 10 11 public Handler(Handler theNextHandler) { 12 m_NextHa

设计模式之责任链模式20170717

行为型设计模式之责任链模式: 一.含义 责任链模式的核心在"链"上,"链"是由多个处理者(对象)组成的,由这条链传递请求,直到有对象处理它为止(在链中决定谁来处理这个请求),并返回相应的结果 二.代码说明 1.主要有两个角色 1)处理者 它能够对请求做出处理(请求得到处理则直接返回,否则传到下一个处理者),设置下一个处理者(这两个操作可以抽象出来), 同时每个处理者都有一个相应的处理级别,以及具体的处理操作(父类实现请求传递,子类实现请求处理) 2)被处理者(请求者

23种设计模式之责任链模式(Chain of Responsibility)

责任链模式是一种对象的行为型模式,避免请求发送者与接收者耦合在一起,让多个对象都有可能接收请求,将这些对象连接成一条链,并且沿着这条链传递请求,直到有对象处理它为止.责任链模式不保证每个请求都被接受,由于一个请求没有明确的接收者,那么就不能保证它一定会被处理. 优点: 1)降低了耦合度. 2)增加向对象指定责任的灵活性. 3)由于在一个类中产生的事件可以被发送到组成中的其它类处理器上,类的集合可以作为一个整体. 使用场景: 1)多个对象可以处理一个请求,而其处理器却是未知的. 2)想要在不指定确

GOF23设计模式之责任链模式(chain of responsibility)与结构型模式总结经典

 责任链模式:Chain of responsibility      将能够处理同一类请求的对象连成一条链,所提交的请求沿着链传递,链上的对象逐个判断是否有能力处理该请求,如果能则处理,如果不能则传递给链上的下一个对象. 场景:      打牌时,轮流出牌.      接力赛跑      大学中,奖学金审批.      公司中,公文审批.   结构型模式汇总: 代理模式:为真实对象提供一个代理,从而控制对真实对象的访问. 适配器模式:使原本由于接口不兼容不能一起工作的类,可以一起工作. 桥

设计模式 笔记 责任链模式 chain of responsibility

//---------------------------15/04/25---------------------------- //Chain of responsibility 责任链-----对象行为型模式 /* 1:意图: 使多个对象都有机会处理请求,从而避免请求的发送者和接受者之间的耦合关系.将这些对象 连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止. 2:动机: 3:适用性: 1>有多个对象可以处理一个请求,哪个对象处理该请求运行时刻自动确定. 2>你想在不明确指定

设计模式(一)Chain Of Responsibility责任链模式(未完成)

设计模式篇章,源于网课的学习,以及个人的整理 在我们接收用户提交的字符时,常常会使用到过滤,在学习责任链模式前,我们是这样做的 1.定义一个类 public class MsgProcesser { String msg; public MsgProcesser(String msg) { this.msg=msg; } public String getMsg() { return msg; } public void setMsg(String msg) { this.msg = msg;

浅谈设计模式:责任链模式(Chain Of Responsibility)

热爱生活.享受娱乐.专注技术,欢迎关注微信公众号QGer,我们一起见证成长! 什么是责任链模式? 官方解释: avoid coupling the sender of a request to its receiver by giving multiple objects a chance to handle the request. 使多个对象都有机会处理请求,从而避免请求的发送者和接受者之间的耦合关系. 通俗解释:一个执行命令可能被多个对象处理,为避免发送命令者和接收(处理)命令者之间具有比