JAVA 职责链模式

文章目录

介绍

职责链模式

实现

介绍

描述

职责链模式设计模式属于行为型模式,为请求创建了一个接受者对象的链,对发送者和接收者进行解耦。
特点

  1.  优点:实现解耦,提高系统的灵活性,简化了对象,使对象不需要知道链的结构,可以动态的添加接收者。

  2.  缺点:性能会收到影响,当链条过长的时候,因此需要控制最大节点数量,对于循环链条,当出现请求不被处理时候会导致循环调用。

实现原理

通常每个接收者都包含对另一个接收者的引用,如果一个对象不能处理该请求,就下放到另一个接收者,依次类推。

适用

  1. 有多个对象可以处理同一个请求,具体哪个对象处理该请求由运行时刻自动确定。

  2. 在不明确指定接收者的情况下,向链条中发送请求,从当前循环者开始进行循环调用找到可以处理的接收者。

职责链模式

实现

实例参考链接:https://blog.csdn.net/ThinkWon/article/details/101384195。

第一步:创建接收者接口。

public abstract class AbstractReceiver {
    public static final int INFO = 1;
    public static final int DEBUG = 2;
    public static final int ERROR = 3;
    protected int level;
    // 下个接收者
    protected AbstractReceiver nextReceiver;

    // 设置当前接收者类的下一个接收者
    public void setReceiver(AbstractReceiver nextReceiver) {
        this.nextReceiver = nextReceiver;
    }

    public void logMsg(int level, String msg) {
        // 当前接受者等级是否小于请求等级,小于则打印出
        if (this.level <= level) {
          record(msg);
        }
        // 判断当前接收者是否还有下一个接收者,有则打出
        if (nextReceiver !=null){
            nextReceiver.logMsg(level,msg);
        }
    }
 
    // 记录内容
    public abstract void record(String msg);
}

第二步:具体接收者定义。

// 接收者 1
public class ConsoleLogger extends AbstractReceiver{
    @Override
    public void record(String msg) {
        System.out.println("控制台显示:" + msg);
    }

    public ConsoleLogger(int level) {
        this.level = level;
    }

}
// 接收者 2
public class FileLogger extends AbstractReceiver {

    public FileLogger(int level) {
        this.level = level;
    }

    @Override
    public void record(String msg) {
        System.out.println("输出到文件中 显示: " + msg);
    }

}
// 接收者 3 
public class ErrorLogger extends AbstractReceiver {

    public ErrorLogger(int level) {
        this.level = level;
    }

    @Override
    public void record(String msg) {
        System.out.println("错误输出 显示: " + msg);
    }

}

第三步:测试。

public class Test {
    public static void main(String[] args) {
        // 链条初始化
        AbstractReceiver error = new ErrorLogger(AbstractReceiver.ERROR);
        AbstractReceiver file = new FileLogger(AbstractReceiver.DEBUG);
        AbstractReceiver console = new ConsoleLogger(AbstractReceiver.INFO);

        console.setReceiver(file);
        file.setReceiver(error);


        // 调用
        System.out.println("============");
        console.logMsg(AbstractReceiver.INFO,"console logger show");
        System.out.println("============");
        console.logMsg(AbstractButton.ERROR,"error logger show");
        /**
         * ============
         * 控制台显示:console logger show
         * ============
         * 控制台显示:error logger show
         * 输出到文件中 显示: error logger show
         * 错误输出 显示: error logger show
         */
    }
}

 

 

 

你可能感兴趣的:(设计模式)