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

    责任链模式

    也叫职责链模式

    定义:为了避免请求发送者和多个请求处理者之间的耦合,于是将所有请求的处理者通过前一对象记住其后一对象的引用。当有请求来时,可将请求沿着链传递,直到有处理者处理它为止。

    优点:

    • 降低了对象之间的耦合度,该模式使得一个对象无须知道到底是哪一个对象处理其请求。
    • 责任链简化了对象之间的连接,每个对象只需要保持一个后继者的引用,不需要保持其他所有的处理者,避免了使用众多的if/else
    • 责任分担,每个类只处理自己该处理的工作,不该处理的传递给下一个对象完成。

    结构:

    • Handler :抽象处理者
    • ConcreteHandler : 具体处理者

    示例场景:班级里面发试卷,老师只把试卷传给第一个同学,第一个学生看看是不是自己的,不是自己的就往后传,直到拿到自己的试卷。

    示例代码:

    public abstract class StudentHandler {
    
        private StudentHandler next;
    
        public StudentHandler getNext() {
            return next;
        }
    
        public void setNext(StudentHandler next) {
            this.next = next;
        }
    
        public abstract void handleRequest(String request);
    }
    
    public class ZhangsanHandler extends StudentHandler {
    
        @Override
        public void handleRequest(String request) {
            if(request.equals("张三")){
                System.out.println("张三拿到试卷了");
            }else {
                this.getNext().handleRequest(request);
            }
    
        }
    }
    
    public class LisiHandler extends StudentHandler {
        @Override
        public void handleRequest(String request) {
            if(request.equals("李四")){
                System.out.println("李四拿到试卷了");
            }else {
                this.getNext().handleRequest(request);
            }
        }
    }
    
    
    public class WangwuHandler extends StudentHandler {
        @Override
        public void handleRequest(String request) {
            if(request.equals("王五")){
                System.out.println("王五拿到试卷了");
            }else {
                this.getNext().handleRequest(request);
            }
        }
    }
    

    测试代码:

    public class ParteenDemo {
    
        public static void main(String[] args) throws InterruptedException, CloneNotSupportedException {
            StudentHandler zhangsan=new ZhangsanHandler();
            StudentHandler lisi=new LisiHandler();
            StudentHandler wangwu=new WangwuHandler();
            zhangsan.setNext(lisi);
            lisi.setNext(wangwu);
    
            zhangsan.handleRequest("王五");
            zhangsan.handleRequest("李四");
        }
    }
    

    返回目录

    书山有路勤为径,学海无涯苦作舟
  • 相关阅读:
    进程间通信:命名管道FIFO(2)
    进程间通信:管道(1)
    POSIX线程学习
    进程与信号学习
    堆栈的区别与联系
    浅读《构建之法:现代软件工程》有感
    CSS学习成长记
    jquery学习成长记(一)
    html学习成长记
    Razor视图
  • 原文地址:https://www.cnblogs.com/javammc/p/14951951.html
Copyright © 2011-2022 走看看