Как следует из названия, схема цепочки ответственности создает цепочку объектов-получателей для запроса. Этот шаблон разъединяет отправителя и получателя запроса в зависимости от типа запроса. Эта модель подпадает под поведенческие модели.
В этом шаблоне обычно каждый получатель содержит ссылку на другой получатель. Если один объект не может обработать запрос, он передает его следующему получателю и так далее.
Реализация
Мы создали абстрактный класс AbstractLogger с уровнем логирования. Затем мы создали три типа регистраторов, расширяющих AbstractLogger . Каждый регистратор проверяет уровень сообщения до своего уровня и печатает соответственно, иначе не печатает и не передает сообщение следующему регистратору.
Шаг 1
Создайте абстрактный класс логгера.
AbstractLogger.java
public abstract class AbstractLogger { public static int INFO = 1; public static int DEBUG = 2; public static int ERROR = 3; protected int level; //next element in chain or responsibility 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); }
Шаг 2
Создавайте конкретные классы, расширяющие регистратор.
ConsoleLogger.java
public class ConsoleLogger extends AbstractLogger { public ConsoleLogger(int level){ this.level = level; } @Override protected void write(String message) { System.out.println("Standard Console::Logger: " + message); } }
ErrorLogger.java
public class ErrorLogger extends AbstractLogger { public ErrorLogger(int level){ this.level = level; } @Override protected void write(String message) { System.out.println("Error Console::Logger: " + message); } }
FileLogger.java
public class FileLogger extends AbstractLogger { public FileLogger(int level){ this.level = level; } @Override protected void write(String message) { System.out.println("File::Logger: " + message); } }
Шаг 3
Создавайте разные типы регистраторов. Назначьте им уровни ошибок и установите следующий регистратор в каждом регистраторе. Следующий регистратор в каждом регистраторе представляет часть цепочки.
ChainPatternDemo.java
public class ChainPatternDemo { private static AbstractLogger getChainOfLoggers(){ AbstractLogger errorLogger = new ErrorLogger(AbstractLogger.ERROR); AbstractLogger fileLogger = new FileLogger(AbstractLogger.DEBUG); AbstractLogger consoleLogger = new ConsoleLogger(AbstractLogger.INFO); errorLogger.setNextLogger(fileLogger); fileLogger.setNextLogger(consoleLogger); return errorLogger; } public static void main(String[] args) { AbstractLogger loggerChain = getChainOfLoggers(); loggerChain.logMessage(AbstractLogger.INFO, "This is an information."); loggerChain.logMessage(AbstractLogger.DEBUG, "This is an debug level information."); loggerChain.logMessage(AbstractLogger.ERROR, "This is an error information."); } }
Шаг 4
Проверьте вывод.