zoukankan      html  css  js  c++  java
  • 设计模式

    graph LR client--调用-->Handler ConcreteHandlerA--继承-->Handler ConcreteHandlerB--继承-->Handler Handler--引用-->Handler

    当 Handler 处理请求时,可以选择自己处理或调用继任者处理该请求。

    abstract class Handler
    {
        protected Handler _successor;
    
        public void SetSuccessor(Handler h)
        {
            this._successor = h;
        }
    
        public abstract void HandlerRequest(int request);
    }
    
    class ConcreteHandlerA : Handler
    {
        public override void HandlerRequest(int request)
        {
            if (request < 10)
            {
                Console.WriteLine(string.Format("{0} handle thing which is {1}", this.GetType().Name, request));
            }
            else if (_successor != null)
            {
                Console.WriteLine(string.Format("{0} cannot handle thing which is {1}", this.GetType().Name, request));
                _successor.HandlerRequest(request);
            }
        }
    }
    
    class ConcreteHandlerB : Handler
    {
        public override void HandlerRequest(int request)
        {
            if (request < 20)
            {
                Console.WriteLine(string.Format("{0} handle thing which is {1}", this.GetType().Name, request));
            }
            else if (_successor != null)
            {
                Console.WriteLine(string.Format("{0} cannot handle thing which is {1}", this.GetType().Name, request));
                _successor.HandlerRequest(request);
            }
        }
    }
    
    class ConcreteHandlerC : Handler
    {
        public override void HandlerRequest(int request)
        {
            if (request < 30)
            {
                Console.WriteLine(string.Format("{0} handler thing which is {1}", this.GetType().Name, request));
            }
            else
            {
                Console.WriteLine(string.Format("{0} say {1} 太高了,再说吧", this.GetType().Name, request));
            }
        }
    }
    
    class Boy : Handler
    {
        public override void HandlerRequest(int request)
        {
            _successor.HandlerRequest(request);
        }
    }
    
    
    // 业务代码:
    ConcreteHandlerC c = new ConcreteHandlerC();
    oncreteHandlerB b = new ConcreteHandlerB();
    b.SetSuccessor(c);
    
    ConcreteHandlerA a = new ConcreteHandlerA();
    a.SetSuccessor(b);
    
    int[] requests = {5, 15, 25, 35};
    foreach (int res in requests)
    {
        boy.HandlerRequest(res);
    }
    
    output:
    ConcreteHandlerA handle thing which is 5
    
    ConcreteHandlerA cannot handle thing which is 15
    ConcreteHandlerB handle thing which is 15
    
    ConcreteHandlerA cannot handle thing which is 25
    ConcreteHandlerB cannot handle thing which is 25
    ConcreteHandlerC handler thing which is 25
    
    ConcreteHandlerA cannot handle thing which is 35
    ConcreteHandlerB cannot handle thing which is 35
    ConcreteHandlerC say 35 太高了,再说吧
    
  • 相关阅读:
    【学习总结】SQL学习总结之SQL语法
    【学习总结】SQL学习总结之认识SQL
    【JAVA】JAVA8-String.join字符串拼接
    【JAVA】Scanner.next()与Scanner.nextLine()的区别
    【JAVA】java中split以"." 、""、“|”分隔字符串
    【问题解决方案】apple music取消订阅
    【问题解决方案】MacBook Pro那些坑
    【JAVA】Java循环语句中的continue跳转进入下一次循环是否判断循环条件
    【问题解决方案】Markdown中部分字符显示为格式因而得不到预期结果的问题解决
    【JAVA】哈希表HashMap中java8新增功能概述
  • 原文地址:https://www.cnblogs.com/MichaelLoveSna/p/14199171.html
Copyright © 2011-2022 走看看