Teknologian jakaminen

Suunnittelumalli vastuullisen mallin ketju

2024-07-12

한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina

Chain of Responsibility Pattern on käyttäytymismalli, jonka avulla useat objektit voivat käsitellä pyyntöjä peräkkäin, ja jokainen objekti voi valita, käsitteleekö pyyntö vai välittääkö se seuraavalle objektille. Tämä malli tarjoaa enemmän joustavuutta ja skaalautuvuutta erottamalla pyyntöjen lähettäjän ja vastaanottajan. Seuraavassa on yksityiskohtainen johdatus vastuullisuusketjumalliin:

1. Määritelmä ja ydinideat

Vastuuketjumallin ydin on pyyntöketjun suunnittelu ja ketjun pään tunnistaminen. Se yhdistää useita pyyntöjenkäsittelyobjekteja ketjuun ja sallii pyynnön välittää ketjun eteenpäin, kunnes ketjussa oleva objekti päättää käsitellä pyyntöä. Pyynnön tekevä asiakas ei tiedä, mikä ketjun objekti lopulta käsittelee pyynnön, minkä ansiosta järjestelmä voi dynaamisesti organisoida uudelleen ja jakaa vastuita asiakkaaseen vaikuttamatta.

2. Luokkakaavio ja pääroolit

Luokkakaavio:

Vastuuketjumalli sisältää pääasiassa seuraavat roolit:

  1. Abstraktin käsittelijä (käsittelijä) : Määritä käyttöliittymä pyyntöjen käsittelyä varten. Tarvittaessa liitäntä voi määrittää menetelmän, jolla viittaus asetetaan ja palautetaan seuraavaan käyttöliittymään. Tämän roolin toteuttaa yleensä abstrakti luokka tai käyttöliittymä.

  2. Betonin käsittelijä : Pyynnön saatuaan tietty käsittelijä voi valita, käsitteleekö pyyntö vai välittääkö pyynnön seuraavalle osapuolelle. Koska betonikäsittelijällä on viittaus seuraavaan kotiin, betoniprosessori pääsee tarvittaessa seuraavaan kotiin.

  3. Asiakasluokka (Client): Luo käsittelyketju ja lähetä pyyntö ketjun pään tietylle prosessoriobjektille.

3. Sovellettavat skenaariot

Vastuuketjumalli sopii seuraaviin skenaarioihin:

  1. Useat objektit käsittelevät yhdessä tehtävää: Esimerkiksi monitasoinen hyväksyntäjärjestelmä välittää hyväksymispyynnön seuraavalle hyväksyjätasolle hyväksyjän valtuuden ja tason perusteella, kunnes lopullinen hyväksyntätulos on saatu.

  2. Dynaaminen yhdistelmäkäsittelyprosessi: Vastuuketjun joustavasti konfiguroimalla prosessointiobjekteja voidaan dynaamisesti yhdistää toteuttamaan erilaisia ​​prosessointiprosesseja.

  3. Vältä suoraa yhteyttä pyynnön lähettäjän ja vastaanottajan välillä: Välittämällä pyynnön vastuuketjuun pyynnön lähettäjän ei tarvitse tietää tiettyä käsittelyobjektia, mikä vähentää objektien välistä riippuvuutta.

4. Edut ja haitat

etu
  1. Vähennä kytkentää: Se erottaa pyynnön lähettäjän ja vastaanottajan. Pyyntö vain lähetetään riippumatta siitä, kuka sen käsittelee.
  2. Parannettu joustavuus objektien määrittämisessä: Mahdollistaa vastuiden dynaamisen lisäämisen tai poistamisen vaihtamalla jäseniä ketjussa tai siirtämällä niiden järjestystä.
  3. Yksinkertaista esineitä: Objektin ei tarvitse tietää ketjun rakennetta.
  4. On kätevää lisätä uusia pyyntöjen käsittelyluokkia: Avaus- ja sulkemisperiaatteen mukaisesti uusia prosessoreita voidaan lisätä vastuuketjuun milloin tahansa muuttamatta olemassa olevaa koodia, mikä tarjoaa hyvän skaalautuvuuden.
puute
  1. Ei ole takeita siitä, että pyyntö hyväksytään: Jos vastuuketjua ei ole määritetty oikein tai prosessori ei käsittele pyyntöä oikein, pyyntöä ei ehkä käsitellä.
  2. Suorituskykyongelmat: Jos vastuuketju on liian pitkä tai pyyntöjä välitetään usein vastuuketjussa, suorituskyky voi vaikuttaa.
  3. Virheenkorjaus on hankalaa: Kun vastuuketju on erityisen pitkä ja siinä on monta lenkkiä, logiikka voi olla monimutkaisempi virheenkorjauksen aikana rekursiivisen lähestymistavan vuoksi.

5. Sovellusskenaariot

Vastuullisuusketjumallia käytetään laajasti monilla aloilla, mukaan lukien, mutta ei rajoittuen:

  1. Kirjausjärjestelmä: Välitä lokiviestit eri loggereille lokitason mukaan, kuten konsoliloggeri, tiedostologgeri, tietokantaloggeri jne.
  2. Poikkeuskäsittelyjärjestelmä: Luokittele poikkeukset niiden tyyppien mukaan, kuten kirjaaminen, sähköposti-ilmoitukset, poikkeusnäyttö jne.
  3. Monitasoinen hyväksyntäjärjestelmä: Esimerkiksi lähtöhyväksyntä, ostohyväksyntä jne. hyväksyntäpyyntö välitetään seuraavan tason hyväksyjälle hyväksyjän valtuuksien ja tason mukaan.

6. Toteutusesimerkkejä

Seuraavassa on yksinkertainen toteutusesimerkki vastuullisuusmallista, jolla käsitellään lokiviestejä ja välitetään viestejä eri prosessoreille lokitason mukaan (kuten DEBUG, INFO, WARN, ERROR):

  1. // 抽象处理者
  2. abstract class LogHandler {
  3. protected int level;
  4. protected LogHandler nextHandler;
  5. public void setNextHandler(LogHandler nextHandler) {
  6. this.nextHandler = nextHandler;
  7. }
  8. //这个是精髓:他除了处理自己的逻辑,还会调用nextHandler进行处理
  9. public void logMessage(int level, String message) {
  10. if (this.level <= level) {
  11. write(message);
  12. }
  13. if (nextHandler != null) {
  14. nextHandler.logMessage(level, message);
  15. }
  16. }
  17. abstract protected void write(String message);
  18. }
  19. // 具体处理者:ErrorLogHandler
  20. class ErrorLogHandler extends LogHandler {
  21. public ErrorLogHandler(int level) {
  22. this.level = level;
  23. }
  24. @Override
  25. protected void write(String message) {
  26. System.out.println("ErrorLogHandler: " + message);
  27. }
  28. }
  29. // 具体处理者:WarnLogHandler
  30. class WarnLogHandler extends LogHandler {
  31. public WarnLogHandler(int level) {
  32. this.level = level;
  33. }
  34. @Override
  35. protected void write(String message) {
  36. System.out.println("WarnLogHandler: " + message);
  37. }
  38. }
  39. // 具体处理者:InfoLogHandler
  40. class InfoLogHandler extends LogHandler {
  41. public InfoLogHandler(int level) {
  42. this.level = level;
  43. }
  44. @Override
  45. protected void write(String message) {
  46. System.out.println("InfoLogHandler: " + message);
  47. }
  48. }
  49. // 客户端代码
  50. public class ChainPatternDemo {
  51. private static LogHandler getChainOfLoggers() {
  52. // 创建链中的处理者
  53. LogHandler errorLogHandler = new ErrorLogHandler(3);
  54. LogHandler warnLogHandler = new WarnLogHandler(2);
  55. warnLogHandler.setNextHandler(errorLogHandler);
  56. LogHandler infoLogHandler = new InfoLogHandler(1);
  57. infoLogHandler.setNextHandler(warnLogHandler);
  58. return infoLogHandler;
  59. }
  60. public static void main(String[] args) {
  61. LogHandler loggerChain = getChainOfLoggers();
  62. loggerChain.logMessage(1, "This is an informational message.");
  63. loggerChain.logMessage(2, "This is a warning message.");
  64. loggerChain.logMessage(3, "This is an error message.");
  65. }
  66. }

Tässä esimerkissä määrittelemme kolme betonipuunkäsittelijäluokkaa (ErrorLogHandlerWarnLogHandlerInfoLogHandler ), ne käsittelevät vastaavasti eritasoisia lokiviestejä. Jokainen käsittelijä sisältää tason (level ), jota käytetään määrittämään, pitäisikö tämän tason viestit käsitellä.SoittamallalogMessagemenetelmällä pyyntö välitetään ketjun ensimmäiselle käsittelijälle (infoLogHandler ), se päättää käsitelläkö sanoman oman tasonsa ja käsittelylogiikkansa perusteella, ja sitten (jos sitä ei käsitellä) välittää pyynnön ketjun seuraavalle prosessorille. Tämä prosessi jatkuu ketjun loppuun tai kunnes pyyntö on käsitelty.

Huomaa, että todellisessa sovelluksessa saatat tarvitaLogHandler Luokka lisää menetelmiä ja ominaisuuksia tukemaan monimutkaisempaa lokinkäsittelylogiikkaa ja -konfiguraatiota. Lisäksi lokitasot käyttävät tyypillisesti luetteloita (enum) kokonaislukujen sijaan koodin luettavuuden ja ylläpidettävyyden parantamiseksi.

7. Johtopäätös

Vastuuketjumallilla saavutetaan joustava pyyntöjen käsittely ja järjestelmän skaalautuvuus yhdistämällä useita pyyntöjä käsitteleviä objekteja ketjuun ja sallimalla pyyntöjen välittää ketjua, kunnes ketjussa oleva objekti päättää käsitellä pyynnön.

Jos vastuullisuusketjumalli on sinulle hyödyllinen, muista tykätä ja tallentaa.