文章目录
介绍
描述
职责链模式设计模式属于行为型模式,为请求创建了一个接受者对象的链,对发送者和接收者进行解耦。
特点
-
优点:实现解耦,提高系统的灵活性,简化了对象,使对象不需要知道链的结构,可以动态的添加接收者。
-
缺点:性能会收到影响,当链条过长的时候,因此需要控制最大节点数量,对于循环链条,当出现请求不被处理时候会导致循环调用。
实现原理
通常每个接收者都包含对另一个接收者的引用,如果一个对象不能处理该请求,就下放到另一个接收者,依次类推。
适用
-
有多个对象可以处理同一个请求,具体哪个对象处理该请求由运行时刻自动确定。
-
在不明确指定接收者的情况下,向链条中发送请求,从当前循环者开始进行循环调用找到可以处理的接收者。
职责链模式
实现
实例参考链接: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
*/
}
}