le mie informazioni di contatto
Posta[email protected]
2024-07-12
한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina
Il modello Chain of Responsibility è un modello di progettazione comportamentale che consente a più oggetti di gestire le richieste in sequenza e ciascun oggetto può scegliere se gestire la richiesta o passarla all'oggetto successivo. Questo modello fornisce maggiore flessibilità e scalabilità disaccoppiando il mittente e il destinatario delle richieste. Di seguito è riportata un’introduzione dettagliata al modello di catena di responsabilità:
Il nucleo del modello di catena di responsabilità è progettare una catena di richieste e identificare la fine della catena. Collega più oggetti di gestione delle richieste in una catena e consente alla richiesta di passare sulla catena finché un oggetto nella catena non decide di gestire la richiesta. Il client che effettua la richiesta non sa quale oggetto nella catena gestirà infine la richiesta, il che consente al sistema di riorganizzare e assegnare dinamicamente le responsabilità senza influire sul client.
Diagramma delle classi:
Il modello di catena di responsabilità prevede principalmente i seguenti ruoli:
Gestore astratto (Gestore) : Definire un'interfaccia per l'elaborazione delle richieste. Se necessario, l'interfaccia può definire un metodo per impostare e restituire un riferimento all'interfaccia successiva. Questo ruolo è solitamente implementato da una classe o interfaccia astratta.
Gestore del calcestruzzo : Dopo aver ricevuto la richiesta, lo specifico responsabile del trattamento può scegliere di elaborare la richiesta o di trasmetterla alla parte successiva. Poiché il trasformatore di calcestruzzo contiene un riferimento alla casa successiva, il trasformatore di calcestruzzo può accedere alla casa successiva, se necessario.
Classe cliente (Cliente): crea una catena di elaborazione e invia una richiesta all'oggetto processore specifico della testata della catena.
Il modello della catena di responsabilità è adatto ai seguenti scenari:
Più oggetti elaborano congiuntamente un'attività: ad esempio, un sistema di approvazione multilivello passa la richiesta di approvazione al livello successivo di approvatore in base all'autorità e al livello dell'approvatore fino all'ottenimento del risultato dell'approvazione finale.
Flusso di elaborazione della combinazione dinamica: Configurando in modo flessibile la catena di responsabilità, gli oggetti di elaborazione possono essere combinati dinamicamente per implementare diversi processi di elaborazione.
Evitare l'accoppiamento diretto tra il mittente e il destinatario di una richiesta: Passando la richiesta alla catena di responsabilità, il mittente della richiesta non ha bisogno di conoscere lo specifico oggetto di elaborazione, riducendo la dipendenza tra gli oggetti.
Il modello della catena di responsabilità è ampiamente utilizzato in molti campi, inclusi ma non limitati a:
Quello che segue è un semplice esempio di implementazione del modello di catena di responsabilità, che viene utilizzato per elaborare i messaggi di log e passare i messaggi a diversi processori in base al livello di log (come 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.");
- }
- }
In questo esempio definiamo tre classi concrete di gestori di log (ErrorLogHandler
、WarnLogHandler
、InfoLogHandler
), gestiscono rispettivamente diversi livelli di messaggi di registro. Ogni gestore contiene un livello (level
), utilizzato per determinare se i messaggi di questo livello devono essere elaborati.A chiamatalogMessage
metodo, la richiesta viene passata al primo gestore della catena (infoLogHandler
), decide se elaborare il messaggio in base al proprio livello e alla propria logica di elaborazione, quindi (se non elaborato) passa la richiesta al processore successivo nella catena. Questo processo continua fino alla fine della catena o fino all'elaborazione della richiesta.
Tieni presente che in un'applicazione reale potrebbe essere necessarioLogHandler
La classe aggiunge più metodi e proprietà per supportare logica e configurazione di elaborazione dei log più complesse. Inoltre, i livelli di log utilizzano in genere le enumerazioni (enum
) anziché numeri interi per migliorare la leggibilità e la manutenibilità del codice.
Il modello della catena di responsabilità raggiunge l'elaborazione flessibile delle richieste e la scalabilità del sistema collegando più oggetti che gestiscono le richieste in una catena e consentendo alla richiesta di passare sulla catena finché un oggetto sulla catena non decide di gestire la richiesta.
Se il modello della catena di responsabilità ti è utile, ricordati di mettere mi piace e collezionarlo.