13. Chain of Responsibility



Documenti analoghi
Main System Monitor Keyboard

Programmazione a Oggetti Lezione 10. Ereditarieta

Ottava Esercitazione. introduzione ai thread java mutua esclusione

GESTIONE DEI PROCESSI

Specifica i tipi di oggetti a creare, utilizzando un istanza prototipo, e crea nuove istanze tramite la copia di questo prototipo.

Modulo 4: Ereditarietà, interfacce e clonazione

Sistemi Operativi MECCANISMI E POLITICHE DI PROTEZIONE. D. Talia - UNICAL. Sistemi Operativi 13.1

MECCANISMI E POLITICHE DI PROTEZIONE 13.1

Concetti Base Eccezioni Eccezioni e Metodi Gerarchia di Eccezioni. Java: Eccezioni. Damiano Macedonio

Esercitazione n 4. Obiettivi

Java Virtual Machine

Java threads (2) Programmazione Concorrente

Protezione. Protezione. Protezione. Obiettivi della protezione

Gestione delle Eccezioni

Realizzazione di una classe con un associazione

Java: Compilatore e Interprete

Prova d Esame Compito B

Telematica II 17. Esercitazione/Laboratorio 6

La struttura dati ad albero binario

Tipi primitivi. Ad esempio, il codice seguente dichiara una variabile di tipo intero, le assegna il valore 5 e stampa a schermo il suo contenuto:

Gestione delle eccezioni in Java

SAPIENZA Università di Roma, Facoltà di Ingegneria

INVIO SMS

Per chi ha la Virtual Machine: avviare Grass da terminale, andando su Applicazioni Accessori Terminale e scrivere grass

Prova d Esame Compito A

Introduzione. Java. Composizione. Esempio -- composizione. G. Prencipe È qualcosa che abbiamo già visto varie volte

L ambizione dei design pattern (letteralmente schemi di programmazione) è quella di offrire soluzioni a problemi ricorrenti che facilitano lo

Esempio: il conto bancario

Parola chiave extends

Light CRM. Documento Tecnico. Descrizione delle funzionalità del servizio

InitZero s.r.l. Via P. Calamandrei, Arezzo

Algoritmi di Ricerca. Esempi di programmi Java

Luca Mari, Sistemi informativi applicati (reti di calcolatori) appunti delle lezioni. Architetture client/server: applicazioni server

Informatica 3. Informatica 3. LEZIONE 6: Il controllo dell esecuzione. Lezione 6 - Modulo 1. Errori durante l esecuzione. Il controllo dell esecuzione

Linguaggi Corso M-Z - Laurea in Ingegneria Informatica A.A Esercitazione. Programmazione Object Oriented in Java

13 - Gestione della Memoria nella Programmazione Orientata agli Oggetti

Outlook Plugin per VTECRM

7 Esercitazione (svolta): Callback. Polling. Java RMI: callback. Server. Server. Client. Client. due possibilità:

Esercizio 1: trading on-line

Siti web centrati sui dati Architettura MVC-2: i JavaBeans

La gestione dell input/output da tastiera La gestione dell input/output da file La gestione delle eccezioni

Visual Basic.NET La Gestione degli Errori di Federico BARBATI

Informatica per la comunicazione" - lezione 13 -

Registri RMI. Massimo Merro Univ. Verona Programmazione di Rete 90 / 247

RMI. Java RMI RMI. G. Prencipe

appunti delle lezioni Architetture client/server: applicazioni server

Fondamenti di Informatica 1. Prof. B.Buttarazzi A.A. 2010/2011

Architettura MVC-2: i JavaBeans

4. Essere informati sui rischi e le misure necessarie per ridurli o eliminarli;

Controllo degli accessi

UnicastRemoteObject. Massimo Merro Programmazione di Rete 103 / 124

Organizzazione della lezione. Lezione 18 Remote Method Invocation - 6. (con callback) L accesso al registry per il rebind()

Algebra di Boole: Concetti di base. Fondamenti di Informatica - D. Talia - UNICAL 1. Fondamenti di Informatica

SOMMARIO Coda (queue): QUEUE. QUEUE : specifica QUEUE

Registratori di Cassa

Programmazione Orientata agli Oggetti in Linguaggio Java

Concetto di Funzione e Procedura METODI in Java

Un esercizio d esame. Flavio De Paoli


void funzioneprova() { int x=2; cout<<"dentro la funzione x="<<x<<endl; }

Fondamenti di Informatica C Esercitazioni di Laboratorio / 3 Outline

Gruppi di Thread. Java threads (3) Gruppi di thread e Timer. Operating Systems. Operating Systems. Java threads 3. Java threads 3

VERIFICHE E APPROVAZIONI CONTROLLO APPROVAZIONE

Programmazione Java Avanzata Concetti su Java

Il Sistema Operativo

Introduzione alla programmazione in C

Modello di Controllo dell Accesso basato sui ruoli (RBAC)

Design Pattern in Java

Java:Struttura di Programma. Fabio Scanu a.s. 2014/2015

Nascita di Java. Che cos e Java? Caratteristiche di Java. Java: linguaggio a oggetti

11/02/2015 MANUALE DI INSTALLAZIONE DELL APPLICAZIONE DESKTOP TELEMATICO VERSIONE 1.0

Soluzione dell esercizio del 2 Febbraio 2004

Monitor. Introduzione. Struttura di un TDA Monitor

Inizializzazione, Assegnamento e Distruzione di Classi

Basi di dati e Web (Moduli: Laboratorio e Siti Web centrati sui Dati) Prova scritta del 14 luglio 2008

INNOVAZIONE XNOTTA PER PORTALI TURISTICI

Esempio ordini 08UMLEX1.1

Il linguaggio C# Eventi ed eccezioni

12 - Introduzione alla Programmazione Orientata agli Oggetti (Object Oriented Programming OOP)

Approccio stratificato

03. Il Modello Gestionale per Processi

Circolare N. 113 del 3 Agosto 2015

Il Web-Service SDMX dell ISTAT

Vittorio Veneto,

Esercizi della lezione 5 di Java

Gruppo Montenegro Portale Vendite

Programmazione di sistemi distribuiti

PSNET UC RUPAR PIEMONTE MANUALE OPERATIVO

Scheduling della CPU. Sistemi multiprocessori e real time Metodi di valutazione Esempi: Solaris 2 Windows 2000 Linux

Ingegneria del Software

La Formazione: elemento chiave nello Sviluppo del Talento. Enzo De Palma Business Development Director

A cura di Giorgio Mezzasalma

Soluzione dell esercizio del 12 Febbraio 2004

flusso delle informazioni... 2 password... 3 password/ inserimento di una nuova richiesta... 4 le condizioni di vendita... 6

19. Introduzione al multi-threading

UFFICIO DI STAFF QUALITA PG QUA 009 rev. 8 del 27/02/2014 RECLAMI E SODDISFAZIONE DEL CLIENTE RECLAMI E SODDISFAZIONE DEL CLIENTE

Relazione su: A cura di:

Test di unità con JUnit4

Transcript:

Chain of Responsibility 92 13. Chain of Responsibility (GoF pag. 223) 13.1. Descrizione Consente di separare il mittente di una richiesta dal destinario, in modo di consentire a più di un oggetto di gestire la richiesta. Gli oggetti destinari vengono messi in cena, e la richiesta trasmessa dentro questa cena fino a trovare un oggetto che la gestisca. 13.2. Esempio Una azienda commerciale deve gestire le richieste di credito dei clienti (customers). Internamente l azienda si organizza in diversi livelli di responsabilità. Al livello più basso (vendor) viene consentito l approvazione di richieste fino a un importo determino. Le richieste che superano questo importo vanno gestite da un livello superiore (sales manager), il quale ha un altro importo massimo da gestire. Richieste che vanno oltre quest ultimo importo, vanno gestire da un livello più alto ancora (client account manager). Il problema riguarda la definizione di un meccanismo di inoltro delle richieste, del quale il chiamante non debba conoscere la struttura. 13.3. Descrizione della soluzione offerta dal ptern Il Chain of responsibility ptern propone la costruzione di una cena di oggetti responsabili della gestione delle richieste pervenute dai clienti. Quando un oggetto della cena riceve una richiesta, analizza se corrisponde a lui gestirla, o, altrimenti, inoltrarla al seguente oggetto dentro la cena. In questo modo, gli oggetti che iniziano la richiesta devono soltanto interfacciarsi con l oggetto più basso della cena di responsabilità. 13.4. Struttura del ptern Client Handler +handlerequest() successor ConcreteHandler +handlerequest()

Chain of Responsibility 93 13.5. Applicazione del ptern Schema del modello CreditRequestHandler Customer +setsuperiorrequesthandler (thesuperior: CreditRequestHandler ) #forwardcreditrequest( amount: int ); successor Vendor SalesManager ClientAccountManager Partecipanti Handler: classe CreditRequestHandler. - Specifica una interfaccia per la gestione delle richieste. - In modo opzionale, implementa un riferimento a un oggetto successore. ConcreteHandler: classi Vendor, SalesManager e ClientAccountManager. - Gestiscono le richieste che corrispondono alla propria responsabilità. - Accedono ad un successore (se è possibile), nel caso in cui la richiesta non corrisponda alla propria gestione. Client: classe Customer. - Inoltra una richiesta a un ConcreteHandler della cena. Descrizione del codice Si presenta la classe astrta CreditRequestHandler che fornisce il meccanismo di costruzione delle cene di oggetti responsabili. Il metodo setsuperiorrequesthandler accetta come parametro un riferimento a un altro CreditRequestHandler che viene segno come responsabile nella cena decisionale. Il metodo creditrequest riceve una richiesta e fornisce come default l inoltro verso il successivo elemento dentro la cena, tramite la chiama al metodo forwardcreditrequest. Il metodo forwardcreditrequest realizza l inoltro effettivo, soltanto se esiste un riferimento a un seguente elemento dentro la cena, altrimenti solleva una eccezione CreditRequestHandlerException.

Chain of Responsibility 94 public abstract class CreditRequestHandler { prive CreditRequestHandler successor; public void setsuperiorrequesthandler( CreditRequestHandler thesuperior ) { successor = thesuperior; protected void forwardcreditrequest( int amount ) if( successor!= null ) successor.creditrequest( amount ); throw new CreditRequestHandlerException(); Ogni oggetto responsabile della cena deve estendere la classe precedente, e fornire la particolare implementazione della propria gestione. Nel caso in cui si verifichi la condizione di dover inoltrare la richiesta all oggetto successivo, deve fare una chiama al metodo forwardcreditrequest eredito dalla superclasse. Il primo tipo di oggetto responsabile nella cena sarà della classe Vendor. Gli oggetti Vendor, in questo esempio, non hanno capacità decisionale, e soltanto il suo ruolo è quello di inoltrare le chiame al livello successivo. Do che tutte queste funzioni sono presenti nella superclasse, il Vendor non richiede codice. public class Vendor extends CreditRequestHandler { Le classi SalesManager e ClientAccountManager estendono CreditRequestManager, specificando la propria gestione nel metodo creditrequest. Ogni oggetto è in grado di approvare o rifiutare una richiesta di credito fino a un importo predetermino. L inoltro delle richieste verso successivi oggetti della cena di responsabilità viene eseguito tramite una chiama al metodo forwardcreditrequest. public class SalesManager extends CreditRequestHandler { if( amount <= 1000 ) if( Mh.random() <.3 ) System.out.println( "Accepted by Sales Manager." ); System.out.println( "Not accepted by Sales Manager." );

Chain of Responsibility 95 public class ClientAccountManager extends CreditRequestHandler { if( amount <= 2000 ) if( Mh.random() <.2 ) System.out.println( "Accepted by Client Account Manager." ); System.out.println("Not accepted by Client Account Manager."); La classe CreditRequestHandlerException serve per rappresentare le eccezioni riguardanti chiame non gestite da nessun oggetto dell intera cena: public class CreditRequestHandlerException extends Exception { public CreditRequestHandlerException() { super( "No handler found to forward the request." ); La classe Customer rappresenta l utente della cena di responsabilità. Il metodo requestcredit riceve come uno dei suoi parametri il riferimento all oggetto della cena a chi deve fare la richiesta. public class Customer { public void requestcredit( CreditRequestHandler crhandler, int amount ) crhandler.creditrequest( amount ); Di seguito si presenta il codice del programma che crea una cena di responsabilità, avendo come elemento iniziale un oggetto Vendor, il quale ha come successore un oggetto SalesManager, il quale, a sua volta, ha come successore un oggetto ClientAccountManager. Si noti che il programma fa richieste di credito per diversi importi, in modo di sfruttare tutto il potere decisionale della cena di responsabilità. public class ChainOfResponsibilityExample { public stic void main(string[] arg) ClientAccountManager clientaccountmgr = new ClientAccountManager(); SalesManager salesmgr = new SalesManager(); Vendor vendor = new Vendor(); vendor.setsuperiorrequesthandler( salesmgr ); salesmgr.setsuperiorrequesthandler( clientaccountmgr ); Customer customer = new Customer(); int i=500; while( i <= 2500 ) { System.out.println( "Credit request for : $"+ i ); customer.requestcredit( vendor, i ); i += 500;

Chain of Responsibility 96 Osservazioni sull esempio Si noti che in questo esempio l ultima richiesta che il cliente riesce a inoltrare non risulta gestita da nessun oggetto della cena, provocando il sollevamento di una eccezione. Esecuzione dell esempio C:\Design Pterns\Behavioral\Chain of responsibility>java ChainOfResponsibilityExample Credit request for : $500 Accepted by Sales Manager. Credit request for : $1000 Not accepted by Sales Manager. Credit request for : $1500 Not accepted by Client Account Manager. Credit request for : $2000 Accepted by Client Account Manager. Credit request for : $2500 Exception in thread "main" CreditRequestHandlerException: No handler found to forward the request. CreditRequestHandler.forwardCreditRequest(CreditRequestHandler.java:17) ClientAccountManager.creditRequest(ClientAccountManager.java:10) CreditRequestHandler.forwardCreditRequest(CreditRequestHandler.java:15) SalesManager.creditRequest(SalesManager.java:11) CreditRequestHandler.forwardCreditRequest(CreditRequestHandler.java:15) CreditRequestHandler.creditRequest(CreditRequestHandler.java:10) Customer.requestCredit(Customer.java:4) ChainOfResponsibilityExample.main(ChainOfResponsibilityExample.java:15) 13.6. Osservazioni sull implementazione in Java Un altro approccio nell utilizzo di questo design ptern può osservarsi nella nel meccanismo di Java per la gestione delle eccezioni: ogni volta che viene solleva una eccezione, questa può essere gestita nello stesso metodo in cui si presenta (tramite le istruzioni try cch ), oppure essere lancia verso il metodo precedente nello stack di chiame. A sua volta, questo metodo potrebbe gestire l eccezione oppure continuare a lanciarlo al successivo. Finalmente, se il metodo main non gestisce l eccezione, la Java Virtual Machine ne tiene cura di esso interrompendo l esecuzione del programma e stampando le informazioni riguardanti l eccezione.