- Modello di catena di responsabilità
- Vantaggio della catena di responsabilità DP
- Utilizzo della catena di responsabilità DP
- UML della catena di responsabilità DP
- Esempio di catena di responsabilità DP
Nella catena di responsabilità, il mittente invia una richiesta a una catena di oggetti. La richiesta può essere gestita da qualsiasi oggetto nella catena.
Un modello di catena di responsabilità dice proprio questo 'evita di accoppiare il mittente di una richiesta con il suo destinatario dando a più oggetti la possibilità di gestire la richiesta'. Ad esempio, un bancomat utilizza il modello di progettazione della catena di responsabilità nel processo di donazione di denaro.
In altre parole, possiamo dire che normalmente ogni ricevitore contiene il riferimento di un altro ricevitore. Se un oggetto non è in grado di gestire la richiesta, passa la stessa al destinatario successivo e così via.
Vantaggio del modello di catena di responsabilità
- Riduce l'accoppiamento.
- Aggiunge flessibilità durante l'assegnazione delle responsabilità agli oggetti.
- Consente a un insieme di classi di agire come una sola; gli eventi prodotti in una classe possono essere inviati ad altre classi di gestori con l'aiuto della composizione.
Utilizzo del modello di catena di responsabilità:
È solito:
formica contro esperto
- Quando più di un oggetto può gestire una richiesta e il gestore è sconosciuto.
- Quando il gruppo di oggetti che può gestire la richiesta deve essere specificato in modo dinamico.
Esempio di modello di catena di responsabilità
Comprendiamo l'esempio del modello di catena di responsabilità dal diagramma UML sopra.
UML per il modello di catena di responsabilità:
Implementazione dell'UML di cui sopra:
Passo 1
Creare un Registratore classe astratta.
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){>
Passaggio 3
Creare un Registratore basato su debug classe.
File: 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.
Passaggio 4
Creare un ErrorBasedLogger classe.
mylivecricletFile: 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.
Passaggio 5
Creare un Cliente ChainOfResponsibility classe.
File: 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'); } }
scarica questo esempio
Produzione
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){>