- Vastuuketjun malli
- Vastuuketjun DP:n etu
- Vastuuketjun DP:n käyttö
- Vastuuketjun DP:n UML
- Esimerkki vastuuketjun DP:stä
Vastuuketjussa lähettäjä lähettää pyynnön objektiketjulle. Pyynnön voi käsitellä mikä tahansa ketjun objekti.
Chain of Responsibility Pattern sanoo, että juuri 'vältä yhdistämästä pyynnön lähettäjää vastaanottajaan antamalla useille objekteille mahdollisuuden käsitellä pyyntö'. Esimerkiksi pankkiautomaatti käyttää Chain of Responsibility -suunnittelumallia rahanantoprosessissa.
Toisin sanoen voidaan sanoa, että normaalisti jokainen vastaanotin sisältää viittauksen toiseen vastaanottimeen. Jos yksi objekti ei pysty käsittelemään pyyntöä, se välittää saman seuraavalle vastaanottajalle ja niin edelleen.
Vastuuketjumallin etu
- Se vähentää kytkentää.
- Se lisää joustavuutta jaettaessa vastuita objekteille.
- Sen avulla luokkien joukko voi toimia yhtenä; yhdessä luokassa tuotetut tapahtumat voidaan lähettää sommittelun avulla muille käsittelijäluokille.
Vastuuketjumallin käyttö:
Sitä käytetään:
terävä kulma
- Kun useampi kuin yksi objekti voi käsitellä pyyntöä ja käsittelijä on tuntematon.
- Milloin objektiryhmä, joka voi käsitellä pyyntöä, on määritettävä dynaamisesti.
Esimerkki vastuullisuusmallista
Ymmärrämme esimerkkiä vastuullisuuskuviosta yllä olevan UML-kaavion avulla.
UML vastuullisuusmallille:
Yllä olevan UML:n toteutus:
Vaihe 1
Luo Kirjaaja abstrakti luokka.
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){>
Vaihe 3
Luo DebugBasedLogger luokkaa.
Tiedosto: 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.
Vaihe 4
Luo ErrorBasedLogger luokkaa.
lanka.tuhoaTiedosto: 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.
Vaihe 5
Luo ChainOfResponsibilityClient luokkaa.
Tiedosto: 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'); } }
lataa tämä esimerkki
Lähtö
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){>