- Шаблон ланцюжка відповідальності
- Перевага ланцюжка відповідальності DP
- Використання ланцюжка відповідальності DP
- UML ланцюжка відповідальності DP
- Приклад ланцюжка відповідальності DP
У ланцюжку відповідальності відправник надсилає запит ланцюжку об’єктів. Запит може оброблятися будь-яким об'єктом у ланцюжку.
Шаблон ланцюга відповідальності говорить про це «уникайте зв’язування відправника запиту з його одержувачем, даючи кільком об’єктам можливість обробити запит». Наприклад, банкомат використовує шаблон проектування ланцюжка відповідальності в процесі надання грошей.
Іншими словами, ми можемо сказати, що зазвичай кожен приймач містить посилання іншого приймача. Якщо один об’єкт не може обробити запит, він передає те ж саме наступному одержувачу і так далі.
Перевага шаблону ланцюжка відповідальності
- Це зменшує зчеплення.
- Це додає гнучкості під час призначення обов’язків об’єктам.
- Це дозволяє набору класів діяти як один; події, створені в одному класі, можуть бути відправлені в інші класи обробників за допомогою композиції.
Використання шаблону ланцюжка відповідальності:
Застосовується:
відмінність тигра і лева
- Коли запит може обробити більше ніж один об’єкт, а обробник невідомий.
- Коли група об'єктів, які можуть обробити запит, повинна бути визначена динамічно.
Приклад шаблону ланцюжка відповідальності
Давайте розберемося на прикладі шаблону ланцюжка відповідальності за наведеною вище діаграмою UML.
UML для шаблону ланцюжка відповідальності:
Реалізація вищезазначеного UML:
Крок 1
Створити Лісоруб абстрактний клас.
public abstract class Logger { public static int OUTPUTINFO=1; public static int ERRORINFO=2; public static int DEBUGINFO=3; protected int levels; protected Logger nextLevelLogger; public void setNextLevelLogger(Logger nextLevelLogger) { this.nextLevelLogger = nextLevelLogger; } public void logMessage(int levels, String msg){ if(this.levels<=levels){ displayloginfo(msg); } if (nextlevellogger!="null)" { nextlevellogger.logmessage(levels, msg); protected abstract void displayloginfo(string < pre> <h4>Step 2</h4> <p> Create a <b>ConsoleBasedLogger</b> class.</p> File: ConsoleBasedLogger.java <pre> public class ConsoleBasedLogger extends Logger { public ConsoleBasedLogger(int levels) { this.levels=levels; } @Override protected void displayLogInfo(String msg) { System.out.println('CONSOLE LOGGER INFO: '+msg); } } </pre> <h4>Step 3</h4> <p>Create a <b>DebugBasedLogger</b> class.</p> File: DebugBasedLogger.java <pre> public class DebugBasedLogger extends Logger { public DebugBasedLogger(int levels) { this.levels=levels; } @Override protected void displayLogInfo(String msg) { System.out.println('DEBUG LOGGER INFO: '+msg); } }// End of the DebugBasedLogger class. </pre> <h4>Step 4</h4> <p>Create a <b>ErrorBasedLogger</b> class.</p> File: ErrorBasedLogger.java <pre> public class ErrorBasedLogger extends Logger { public ErrorBasedLogger(int levels) { this.levels=levels; } @Override protected void displayLogInfo(String msg) { System.out.println('ERROR LOGGER INFO: '+msg); } }// End of the ErrorBasedLogger class. </pre> <h4>Step 5</h4> <p>Create a <b>ChainOfResponsibilityClient</b> class.</p> File: ChainofResponsibilityClient.java <pre> public class ChainofResponsibilityClient { private static Logger doChaining(){ Logger consoleLogger = new ConsoleBasedLogger(Logger.OUTPUTINFO); Logger errorLogger = new ErrorBasedLogger(Logger.ERRORINFO); consoleLogger.setNextLevelLogger(errorLogger); Logger debugLogger = new DebugBasedLogger(Logger.DEBUGINFO); errorLogger.setNextLevelLogger(debugLogger); return consoleLogger; } public static void main(String args[]){ Logger chainLogger= doChaining(); chainLogger.logMessage(Logger.OUTPUTINFO, 'Enter the sequence of values '); chainLogger.logMessage(Logger.ERRORINFO, 'An error is occured now'); chainLogger.logMessage(Logger.DEBUGINFO, 'This was the error now debugging is compeled'); } } </pre> <hr> download this example <h4>Output</h4> <pre> bilityClient CONSOLE LOGGER INFO: Enter the sequence of values CONSOLE LOGGER INFO: An error is occured now ERROR LOGGER INFO: An error is occured now CONSOLE LOGGER INFO: This was the error now debugging is compeled ERROR LOGGER INFO: This was the error now debugging is compeled DEBUG LOGGER INFO: This was the error now debugging is compeled </pre></=levels){>
Крок 3
Створити DebugBasedLogger клас.
Файл: DebugBasedLogger.javapublic class DebugBasedLogger extends Logger { public DebugBasedLogger(int levels) { this.levels=levels; } @Override protected void displayLogInfo(String msg) { System.out.println('DEBUG LOGGER INFO: '+msg); } }// End of the DebugBasedLogger class.
Крок 4
Створити ErrorBasedLogger клас.
код кодування ХаффманаФайл: ErrorBasedLogger.java
public class ErrorBasedLogger extends Logger { public ErrorBasedLogger(int levels) { this.levels=levels; } @Override protected void displayLogInfo(String msg) { System.out.println('ERROR LOGGER INFO: '+msg); } }// End of the ErrorBasedLogger class.
Крок 5
Створити ChainOfResponsibilityClient клас.
Файл: ChainofResponsibilityClient.javapublic class ChainofResponsibilityClient { private static Logger doChaining(){ Logger consoleLogger = new ConsoleBasedLogger(Logger.OUTPUTINFO); Logger errorLogger = new ErrorBasedLogger(Logger.ERRORINFO); consoleLogger.setNextLevelLogger(errorLogger); Logger debugLogger = new DebugBasedLogger(Logger.DEBUGINFO); errorLogger.setNextLevelLogger(debugLogger); return consoleLogger; } public static void main(String args[]){ Logger chainLogger= doChaining(); chainLogger.logMessage(Logger.OUTPUTINFO, 'Enter the sequence of values '); chainLogger.logMessage(Logger.ERRORINFO, 'An error is occured now'); chainLogger.logMessage(Logger.DEBUGINFO, 'This was the error now debugging is compeled'); } }
завантажити цей приклад
Вихід
bilityClient CONSOLE LOGGER INFO: Enter the sequence of values CONSOLE LOGGER INFO: An error is occured now ERROR LOGGER INFO: An error is occured now CONSOLE LOGGER INFO: This was the error now debugging is compeled ERROR LOGGER INFO: This was the error now debugging is compeled DEBUG LOGGER INFO: This was the error now debugging is compeled=levels){>