java数据结构与算法总结(十五)--责任链模式优缺点

来自https://www.cnblogs.com/myseries/p/10944937.html

目录

1.1 简介

1.2 责任链模式优缺点

2 模式结构

 2.1 对象定义

 2.2 类图及设计

 2.3 适用场景:

1.1 简介

  • 责任链模式为请求创建一个接收者对象链,每个接收者都包含对另一个接收者的引用,如果一个对象不能处理该请求,那么它会把请求传给下一个接收者,依此类推
  • 责任链模式避免了请求的发送者和接收者耦合在一起,让多个对象都有可能接收请求,将这些对象连成一条链,并且沿着这条链传递请求,直到有对象处理它为止。

1.2 责任链模式优缺点

 优点

降低耦合度。它将请求的发送者和接收者解耦 
简化了对象,使得对象不需要知道链的结构 
增强给对象指派职责的灵活性,允许动态地新增或者删除责任链 
增加新的请求处理类方便

 缺点

不能保证请求一定被接收; 
系统性能将受到一定影响,调试时不方便,可能会造成循环调用

2 模式结构

 2.1 对象定义

  Handler(抽象处理者) : 定义一个处理请求的接口,提供对后续处理者的引用 
  ConcreteHandler(具体处理者) : 抽象处理者的子类,处理用户请求,可选将请求处理掉还是传给下家;在具体处理者中可以访问链中下一个对象,以便请求的转发

 2.2 类图及设计

java数据结构与算法总结(十五)--责任链模式优缺点_第1张图片

代码详解:

 抽象处理者

public abstract class Handler {

    protected Handler nextHandler; // 下一个责任链成员

    public Handler getNextHandler() {
        return nextHandler;
    }

    public void setNextHandler(Handler nextHandler) {
        this.nextHandler = nextHandler;
    }

    // 处理传递过来的时间
    public abstract void handleMessage(int type);
}

 具体处理者 
  在当前处理者对象无法处理时,将执行权传给下一个处理者对象

public class ConcreteHandler1 extends Handler {

    @Override
    public void handleMessage(int type) {
        if (type == 1 || type == 3) {
            System.out.println("ConcreteHandler1解决了问题!");
        } else {
            System.out.println("ConcreteHandler1解决不了问题......");
            if (nextHandler != null) {
                nextHandler.handleMessage(type);
            } else {
                System.out.println("没有人能处理这个消息");
            }
        }
    }
}

public class ConcreteHandler2 extends Handler {

    @Override
    public void handleMessage(int type) {
        if (type == 2 || type == 5) {
            System.out.println("ConcreteHandler2解决了问题!");
        } else {
            System.out.println("ConcreteHandler2解决不了问题......");
            if (nextHandler != null) {
                nextHandler.handleMessage(type);
            } else {
                System.out.println("没有人能处理这个消息");
            }
        }
    }
}

public class ConcreteHandler3 extends Handler {

    @Override
    public void handleMessage(int type) {
        if (type == 4 || type == 6) {
            System.out.println("ConcreteHandler3解决了问题!");
        } else {
            System.out.println("ConcreteHandler3解决不了问题......");
            if (nextHandler != null) {
                nextHandler.handleMessage(type);
            } else {
                System.out.println("没有人能处理这个消息");
            }
        }
    }
}

 Client 客户端调用

// 初始化责任链:handler1 -> handler2 -> handler3
        Handler handler1 = new ConcreteHandler1();
        Handler handler2 = new ConcreteHandler2();
        Handler handler3 = new ConcreteHandler3();
        handler2.setNextHandler(handler3);
        handler1.setNextHandler(handler2);
        // 处理事件
        System.out.println("--------------Message1");
        handler1.handleMessage(1);
        System.out.println("--------------Message2");
        handler1.handleMessage(2);
        System.out.println("--------------Message3");
        handler1.handleMessage(4);
        System.out.println("--------------Message4");
        handler1.handleMessage(7);

  从上述模式可以知道,当我们需要多个 ifelse 做逻辑判断的时候,可以引入,从而提高代码可维护性

 2.3 适用场景:

  • 有多个对象可以处理同一个请求,具体哪个对象处理该请求由运行时刻自动确定
  • 在不明确指定接收者的情况下,向多个对象中的某一个对象提交一个请求
  • 可动态指定一组对象的处理请求

 更详细分析请看这篇:实际项目中运用责任链模式


 

另一个例子阐述:直接用马士兵老师中的一个例子来讲解

 我们有一个字符串String msg = ":):,

你可能感兴趣的:(java数据结构与算法,责任链模式优缺点)