代码:
package com.zhang.ReponsibilityChain;
import java.awt.Toolkit;
// 抽象基类
abstract class MyLogger {
public final static int DEBUG = 0;
public final static int INFO = 1;
public final static int WARN = 2;
public final static int ERROR = 3;
public final static int FATAL = 4;
public final static String[] MSG = { "[DEBUG]", "[INFO]", "[WARN]", "[ERROR]", "[FATAL]" };
protected int l;
private MyLogger next;
{
l = 0;
next = null;
}
public MyLogger(int l, MyLogger next) {
this.l = l;
this.next = next;
}
public int getL() {
return l;
}
public void setL(int l) {
this.l = l;
}
public MyLogger getNext() {
return next;
}
public void setNext(MyLogger next) {
this.next = next;
}
public void output(int l, String msg) {
write(l, msg);
if (next != null) {
next.output(l, msg);
}
}
abstract protected void write(int l, String msg);
}
// 实现,将日志输出到控制台
class MyLoggerConsole extends MyLogger {
public MyLoggerConsole(int l, MyLogger next) {
super(l, next);
}
@Override
protected void write(int l, String msg) {
if (l >= this.l) {
System.out.println(MSG[l] + msg);
}
}
}
// 实现,根据等级的不同发出不同次数的蜂鸣
class MyLoggerBeep extends MyLogger {
private int beepFrequency;
public MyLoggerBeep(int beepFrequency, int l, MyLogger next) {
super(l, next);
this.beepFrequency = beepFrequency;
}
@Override
protected void write(int l, String msg) {
if (l == this.l) {
for (int i = 0; i < beepFrequency; i++) {
Toolkit.getDefaultToolkit().beep();
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
}
public class ReponsibilityChain {
public static void main(String[] args) {
// 构建整个日志的处理链条
// 第一个节点将日志输出到控制台
// 第二个节点,如果是"WARN"级别,发出一次"滴"
// 第三个节点,如果是"ERROR"级别,发出三次"滴"
// 第四个节点,如果是"FATAL"级别,发出五次"滴"
MyLogger logger = new MyLoggerConsole(MyLogger.DEBUG, new MyLoggerBeep(1, MyLogger.WARN,
new MyLoggerBeep(3, MyLogger.ERROR, new MyLoggerBeep(5, MyLogger.FATAL, null))));
logger.output(Integer.parseInt(args[0]), args[1]);
}
}
最后的链条可以根据需求任意组装。
责任链模式与与装饰器模式的实现方式完全相同,但是思路不同。装饰器模式必需先要有一个主体实现,然后再在主体上增加修饰器的实现。责任链模式无此区分,只要将多种实现串成一个链条就可以。