yhteystietoni
Mailmesophia@protonmail.com
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:
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.
Luokkakaavio:
Vastuuketjumalli sisältää pääasiassa seuraavat roolit:
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ä.
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.
Asiakasluokka (Client): Luo käsittelyketju ja lähetä pyyntö ketjun pään tietylle prosessoriobjektille.
Vastuuketjumalli sopii seuraaviin skenaarioihin:
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.
Dynaaminen yhdistelmäkäsittelyprosessi: Vastuuketjun joustavasti konfiguroimalla prosessointiobjekteja voidaan dynaamisesti yhdistää toteuttamaan erilaisia prosessointiprosesseja.
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.
Vastuullisuusketjumallia käytetään laajasti monilla aloilla, mukaan lukien, mutta ei rajoittuen:
Seuraavassa on yksinkertainen toteutusesimerkki vastuullisuusmallista, jolla käsitellään lokiviestejä ja välitetään viestejä eri prosessoreille lokitason mukaan (kuten DEBUG, INFO, WARN, ERROR):
- // 抽象处理者
- abstract class LogHandler {
- protected int level;
- protected LogHandler nextHandler;
-
- public void setNextHandler(LogHandler nextHandler) {
- this.nextHandler = nextHandler;
- }
-
- //这个是精髓:他除了处理自己的逻辑,还会调用nextHandler进行处理
- public void logMessage(int level, String message) {
- if (this.level <= level) {
- write(message);
- }
- if (nextHandler != null) {
- nextHandler.logMessage(level, message);
- }
- }
-
- abstract protected void write(String message);
- }
-
- // 具体处理者:ErrorLogHandler
- class ErrorLogHandler extends LogHandler {
- public ErrorLogHandler(int level) {
- this.level = level;
- }
-
- @Override
- protected void write(String message) {
- System.out.println("ErrorLogHandler: " + message);
- }
- }
-
- // 具体处理者:WarnLogHandler
- class WarnLogHandler extends LogHandler {
- public WarnLogHandler(int level) {
- this.level = level;
- }
-
- @Override
- protected void write(String message) {
- System.out.println("WarnLogHandler: " + message);
- }
- }
-
- // 具体处理者:InfoLogHandler
- class InfoLogHandler extends LogHandler {
- public InfoLogHandler(int level) {
- this.level = level;
- }
-
- @Override
- protected void write(String message) {
- System.out.println("InfoLogHandler: " + message);
- }
- }
-
- // 客户端代码
- public class ChainPatternDemo {
- private static LogHandler getChainOfLoggers() {
- // 创建链中的处理者
- LogHandler errorLogHandler = new ErrorLogHandler(3);
-
- LogHandler warnLogHandler = new WarnLogHandler(2);
- warnLogHandler.setNextHandler(errorLogHandler);
-
- LogHandler infoLogHandler = new InfoLogHandler(1);
- infoLogHandler.setNextHandler(warnLogHandler);
-
- return infoLogHandler;
- }
-
- public static void main(String[] args) {
- LogHandler loggerChain = getChainOfLoggers();
-
- loggerChain.logMessage(1, "This is an informational message.");
- loggerChain.logMessage(2, "This is a warning message.");
- loggerChain.logMessage(3, "This is an error message.");
- }
- }
Tässä esimerkissä määrittelemme kolme betonipuunkäsittelijäluokkaa (ErrorLogHandler
、WarnLogHandler
、InfoLogHandler
), 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ä.SoittamallalogMessage
menetelmä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.
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.