zoukankan      html  css  js  c++  java
  • 设计模式-责任链模式

    最典型的就是击鼓传花了,一个传一个,等到适合的人接到。在程序里就是请求者不可以和多个接收者耦合在一起,将所有请求的处理者根据前一对象记住下一个对象的引用形成一条责任链,将请求沿着责任链传递,一直到负责处理请求的对象出现

    责任链模式有三个角色,抽象处理者,具体处理者,客户类。抽象处理者定义一个处理请求的接口,包含处理方法和另一个链接。具体请求者实现该抽象方法,判断该方法是否可以处理,不能处理则传给后继者。客户类负责创建责任链,并向责任链的具体处理者发送请求,他不在乎处理链的传递和请求的细节处理过程

    抽象处理者,包含下一个处理者的引用

    abstract class Handler {
        private Handler next;
    
        public void setNext(Handler next) {
            this.next = next;
        }
    
        public Handler getNext() {
            return next;
        }
        public abstract  void handleNumber(int number);
    }

    具体处理者1

    public class Handler1 extends Handler {
        @Override
        public void handleNumber(int number) {
            if(number<10){
                System.out.println("1号处理");
            }else{
                if(getNext()!=null){
                    System.out.println("传给下一个处理");
                    getNext().handleNumber(number);
                }else System.out.println("没有人处理");
    
            }
        }
    }

    具体处理者2

    public class Handler2 extends Handler {
        @Override
        public void handleNumber(int number) {
            if(number<100){
                System.out.println("2号处理");
    
                System.out.println(number);
            }else{
                if(getNext()!=null){
                    System.out.println("传给下一个");
                    getNext().handleNumber(number);
                }else{
                    System.out.println("没有人处理该请求");
                }
    
            }
        }
    }

    测试类

    public class Client {
        public static void main(String[] args) {
            Handler1 handler1 = new Handler1();
            handler1.setNext(new Handler2());
            handler1.handleNumber(100);
        }
    }

    可以看出,每一个处理类都要设置下一个的责任链,如果一条责任链都没有对象可以处理该请求,就会返回无法处理的信息给请求者。

    应用场景:有多个对象处理请求,但请求者不知道具体哪个对象处理的时候可以选择此模式,此模式还可以动态的添加动作链

    不和别人一样,不复制只真正理解
  • 相关阅读:
    [Cerc2013]Magical GCD
    UVA 1393 Highways
    UVA 10214 Trees in a Wood
    [SDOI2010]大陆争霸
    Oracle逻辑读详解
    DBA_2PC_PENDING (转)
    oracle autotrace使用
    升级oracle 9i到10g
    VMware 虚拟机中添加新硬盘的方法(转载)
    ERROR 2002 (HY000): Can’t connect to local MySQL server through socket ‘/var mysql (转)
  • 原文地址:https://www.cnblogs.com/Vinlen/p/12792645.html
Copyright © 2011-2022 走看看