首页 > 其他分享 >设计模式之责任链模式

设计模式之责任链模式

时间:2022-10-06 11:47:17浏览次数:50  
标签:Console SetNext request 模式 责任 handler IHandler Handle 设计模式

责任链模式

概念

Chain of Responsibility is a behavioral design pattern that lets you pass requests along a chain of handlers. Upon receiving a request, each handler decides either to process the request or to pass it to the next handler in the chain.

责任链模式是一种行为设计模式, 允许你将请求沿着处理者链进行发送。 收到请求后, 每个处理者均可对请求进行处理, 或将其传递给链上的下个处理者

场景

责任链模式主要是按顺序处理一些列请求的时候,将处理函数分离在独立的模块中,再串联成责任链,依次处理的一种设计模式。

如果你编写了一个方法,要处理一个学生毕业这个行为。那么这个学生提交毕业请求后,需要先检查他的成绩是否都合格,接着检查毕业论文是否提交,然后检查导师是否同意毕业,最后检查校领导是否同意毕业。

如果这些检查被封装到一个方法里,这个方法会随着业务的变化,越来越臃肿。责任链模式主要是将每个检查拆解成独立的类,然后按照顺序依次调用。

毕业请求传递到当前类,如果检查成功,就将请求传递给下一个类。如果拒绝请求,就终止这个毕业请求。

责任链模式在很多语言中被广泛应用,并常常结合组合模式使用。例如,在HTML中浏览器事件在冒泡阶段,点击按钮时,先把click事件发送给当前按钮,然后发送给按钮的容器,再发送给容器所在的页面,依次向上传递。

优势

  • 请求的处理函数严格按照责任链的顺序执行
  • 每个处理类,单一职责
  • 新增处理类比较简单

案例

首先为处理类定义接口

    public interface IHandler
    {
        IHandler SetNext(IHandler handler);
        
        object Handle(object request);
    }

 

然后编写一批处理类

abstract class AbstractHandler : IHandler
    {
        private IHandler _nextHandler;

        public IHandler SetNext(IHandler handler)
        {
            this._nextHandler = handler;
            
            // Returning a handler from here will let us link handlers in a
            // convenient way like this:
            // monkey.SetNext(squirrel).SetNext(dog);
            return handler;
        }
        
        public virtual object Handle(object request)
        {
            if (this._nextHandler != null)
            {
                return this._nextHandler.Handle(request);
            }
            else
            {
                return null;
            }
        }
    }

    class MonkeyHandler : AbstractHandler
    {
        public override object Handle(object request)
        {
            if ((request as string) == "Banana")
            {
                return $"Monkey: I'll eat the {request.ToString()}.\n";
            }
            else
            {
                return base.Handle(request);
            }
        }
    }

 

这里为所有处理类,编写了一个基类

    class Client
    {
        // The client code is usually suited to work with a single handler. In
        // most cases, it is not even aware that the handler is part of a chain.
        public static void ClientCode(AbstractHandler handler)
        {
            foreach (var food in new List<string> { "Nut", "Banana", "Cup of coffee" })
            {
                Console.WriteLine($"Client: Who wants a {food}?");

                var result = handler.Handle(food);

                if (result != null)
                {
                    Console.Write($"   {result}");
                }
                else
                {
                    Console.WriteLine($"   {food} was left untouched.");
                }
            }
        }
    }

 

编写一个类,负责按照顺序调用责任链的每一个Command

实际调用,可以灵活的选择从哪一个类开始调用

            // The other part of the client code constructs the actual chain.
            var monkey = new MonkeyHandler();
            var squirrel = new SquirrelHandler();
            var dog = new DogHandler();

            monkey.SetNext(squirrel).SetNext(dog);

            // The client should be able to send a request to any handler, not
            // just the first one in the chain.
            Console.WriteLine("Chain: Monkey > Squirrel > Dog\n");
            Client.ClientCode(monkey);
            Console.WriteLine();

            Console.WriteLine("Subchain: Squirrel > Dog\n");
            Client.ClientCode(squirrel);

标签:Console,SetNext,request,模式,责任,handler,IHandler,Handle,设计模式
From: https://www.cnblogs.com/chenyingzuo/p/16757299.html

相关文章

  • 设计模式之命令模式
    命令模式概念Command isabehavioraldesignpatternthatturnsarequestintoastand-aloneobjectthatcontainsallinformationabouttherequest.Thistra......
  • 5-互评-OO之接口-DAO模式代码阅读及应用
    DAO模式是接口的一个典型应用。阅读附件中的参考代码,并回答以下问题:StudenDaoListImpl.java与StudentDaoArrayImpl.java有何不同?StudenDaoListImpl.java采用List存......
  • 分组密码的基本的工作模式、优缺点
    1、电子密码本ECB(Electroniccodebook)需要加密的消息按照块密码的块大小被分为数个块,并对每个块进行独立加密。适用于数据较少的情况,比如加密秘钥。优点:简单、快速、......
  • 设计模式-外观模式
    将多个内部模块的调用封装在一个类中。这个外观模式的化,它是facade模式,这个是它的一个英文名啊,那我们这边的话呢,还是一样啊,上来给大家举一个场景吧,这个场景啊,假设我们现在......
  • 一篇文章让你彻底理解Java的单例设计模式
    下文是笔者编写的单例模式实现的八种方式,如下所示:单例模式的简介我们将一个类在当前进程中只有一个实例的这种模式,称之为“单例模式”那么Java代码如何实现一个单例模式呢?......
  • JAVA设计模式-装饰模式
    JAVA设计模式-装饰模式介绍装饰模式是一种结构型模式,在不改变现有对象结构的前提下,给现有对象添加新的功能,动态增加职责,是现有类的一个包装。角色Component:定义一......
  • Rust从入门到精通09-模式解构
    "PatternDestructure"是Rust中一个重要且实用的设计。通常翻译为“模式解构”。Destructure单词翻译为把原来的结构肢解为单独的、原始的部分。下面我们举例说明什么......
  • 【分享】从Mybatis源码中,学习到的10种设计模式
    作者:小傅哥​沉淀、分享、成长,让自己和他人都能有所收获!......
  • 10.设计模式-组合模式
    //1.定义接口,包括所有的属性和方法,传入的是自身的实现类//2.定义实现类,重写相关方法//3.直到叶子节点为止packagecom.serlyf.composite;publicabstractclassOrg......
  • 13.设计模式-适配器模式-接口适配器
    //1.定义接口//2.定义抽象实现,通过抽象类来实现适配,//当存在这样一个接口,其中定义了N多的方法,而我们现在却只想使用其中的一个到几个方法,如果我们直接实现接口,那么我们......