**责任链模式:**使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系。将这些对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止。
组成:
- 抽象处理者角色(Handler):它定义了一个处理请求的接口。当然对于链子的不同实现,也可以在这个角色中实现后继链。
- 具体处理者角色(Concrete Handler):实现抽象角色中定义的接口,并处理它所负责的请求。如果不能处理则访问它的后继者。
解决:
职责链上的处理者负责处理请求,客户只需要将请求发送到职责链上即可,无须关心请求的处理细节和请求的传递,所以职责链将请求的发送者和请求的处理者解耦了。
优点: 1、降低耦合度。它将请求的发送者和接收者解耦。 2、简化了对象。使得对象不需要知道链的结构。 3、增强给对象指派职责的灵活性。通过改变链内的成员或者调动它们的次序,允许动态地新增或者删除责任。 4、增加新的请求处理类很方便。
缺点: 1、不能保证请求一定被接收。 2、系统性能将受到一定影响,而且在进行代码调试时不太方便,可能会造成循环调用。 3、可能不容易观察运行时的特征,有碍于除错。
实现:
package HeadFirstDesignMode.chainofresponsibility;
/**
* 描述:责任链模式
*/
public class ChainOfResponsibilityPattern {
public static void main(String[] args) {
AbstractLogger loggerChain = getChainOfLoggers();
loggerChain.logMessage(AbstractLogger.INFO, "正常信息输出");
loggerChain.logMessage(AbstractLogger.DEBUG, "debug信息输出");
loggerChain.logMessage(AbstractLogger.ERROR, "error信息输出");
}
private static AbstractLogger getChainOfLoggers(){
AbstractLogger consoleLogger = new ConsoleLogger(AbstractLogger.INFO);
AbstractLogger fileLogger = new FileLogger(AbstractLogger.DEBUG);
fileLogger.setNextLogger(consoleLogger);
AbstractLogger errorLogger = new ErrorLogger(AbstractLogger.ERROR);
errorLogger.setNextLogger(fileLogger);
return errorLogger;
}
}
abstract class AbstractLogger {
public static int INFO = 1;
public static int DEBUG = 2;
public static int ERROR = 3;
protected int level;
//责任链中的下一个对象
protected AbstractLogger nextLogger;
public void setNextLogger(AbstractLogger nextLogger){
this.nextLogger = nextLogger;
}
public void logMessage(int level, String message){
if(this.level <= level){
write(message);
}
if(nextLogger !=null){
nextLogger.logMessage(level, message);
}
}
abstract protected void write(String message);
}
class ConsoleLogger extends AbstractLogger {
public ConsoleLogger(int level){
this.level = level;
}
@Override
protected void write(String message) {
System.out.println("标准日志 " + message);
}
}
class ErrorLogger extends AbstractLogger {
public ErrorLogger(int level){
this.level = level;
}
@Override
protected void write(String message) {
System.out.println("错误日志 " + message);
}
}
class FileLogger extends AbstractLogger {
public FileLogger(int level){
this.level = level;
}
@Override
protected void write(String message) {
System.out.println("文件日志 " + message);
}
}
标签:AbstractLogger,请求,处理,模式,责任,int,static,public
From: https://blog.51cto.com/u_11906056/7011754