Movatterモバイル変換


[0]ホーム

URL:


Vai al contenuto
WikipediaL'enciclopedia libera
Ricerca

Chain-of-responsibility pattern

Da Wikipedia, l'enciclopedia libera.
Niente fonti!
Questa voce o sezione sull'argomento linguaggi di programmazionenon cita le fonti necessarie o quelle presenti sono insufficienti.

IlChain-of-responsibility è undesign pattern utilizzato nellaprogrammazione ad oggetti e definito nel famoso libro dellaGang of Four.

Scopo del pattern

[modifica |modifica wikitesto]

Ilpattern permette di separare gli oggetti che invocano richieste, dagli oggetti che le gestiscono, dando ad ognuno la possibilità di gestire queste richieste. Viene utilizzato il termine catena perché di fatto la richiesta viene inviata e "segue la catena" di oggetti, passando da uno all'altro, finché non trova quello che la gestisce.

Applicabilità

[modifica |modifica wikitesto]

Il pattern è comodo quando non conosciamo a priori quale oggetto è in grado di gestire una determinata richiesta, sia perché effettivamente è sconosciuto staticamente o sia perché l'insieme degli oggetti in grado di gestire richieste cambia dinamicamente a runtime.

Struttura

[modifica |modifica wikitesto]
Struttura del pattern Chain-of-responsibility

La struttura del pattern è piuttosto semplice, le componenti principali sono 2:

  • Handler, che rappresenta la classe astratta che offre il metodoHandleRequest che sarà il metodo utilizzato dalle componenti per inoltrare richieste all'oggetto contenuto;
  • ConcreteHandler, che rappresenta l'effettiva implementazione della gestione degli eventi per un oggetto.

Ogni oggetto facente parte della catena deve implementare il metodoHandleRequest che gestirà il tipo di richiesta ricevuta (se è lui che se ne deve occupare), altrimenti chiamerà lo stesso metodo sull'oggetto contenuto all'interno (ed è per questo che si viene a formare una catena, allo stesso modo del patterndecorator).

Esempio

[modifica |modifica wikitesto]

Java

[modifica |modifica wikitesto]

Qui viene presentato un esempio del pattern in Java.Nell'esempio vi sono differenti ruoli ognuno con un limite massimo per un acquisto e un successore. Ogni volta che una persona (che ha un determinato ruolo) riceve un ordine di acquisto che sorpassa il proprio limite, passa la richiesta al successore nella catena di comando.

Classe astratta PurchasePower con il metodo astratto processRequest.

abstractclassPurchasePower{protectedstaticfinaldoubleBASE=500;protectedPurchasePowersuccessor;abstractprotecteddoublegetAllowable();abstractprotectedStringgetRole();publicvoidsetSuccessor(PurchasePowersuccessor){this.successor=successor;}publicvoidprocessRequest(PurchaseRequestrequest){if(request.getAmount()<this.getAllowable()){System.out.println(this.getRole()+" will approve $"+request.getAmount());}elseif(successor!=null){successor.processRequest(request);}}}

Quattro implementazioni della classe astratta con quattro ruoli: Manager, Director, Vice President, President

classManagerPPowerextendsPurchasePower{protecteddoublegetAllowable(){returnBASE*10;}protectedStringgetRole(){return"Manager";}}classDirectorPPowerextendsPurchasePower{protecteddoublegetAllowable(){returnBASE*20;}protectedStringgetRole(){return"Director";}}classVicePresidentPPowerextendsPurchasePower{protecteddoublegetAllowable(){returnBASE*40;}protectedStringgetRole(){return"Vice President";}}classPresidentPPowerextendsPurchasePower{protecteddoublegetAllowable(){returnBASE*60;}protectedStringgetRole(){return"President";}}

Classe PurchaseRequest che contiene i dati di una richiesta d'acquisto.

classPurchaseRequest{privatedoubleamount;privateStringpurpose;publicPurchaseRequest(doubleamount,Stringpurpose){this.amount=amount;this.purpose=purpose;}publicdoublegetAmount(){returnamount;}publicvoidsetAmount(doubleamt){amount=amt;}publicStringgetPurpose(){returnpurpose;}publicvoidsetPurpose(Stringreason){purpose=reason;}}

Nel seguente esempio la catena delle gerarchie è così definita: Manager → Director → Vice President → President

classCheckAuthority{publicstaticvoidmain(String[]args){ManagerPPowermanager=newManagerPPower();DirectorPPowerdirector=newDirectorPPower();VicePresidentPPowervp=newVicePresidentPPower();PresidentPPowerpresident=newPresidentPPower();manager.setSuccessor(director);director.setSuccessor(vp);vp.setSuccessor(president);// Press Ctrl+C to end.try{while(true){System.out.println("Enter the amount to check who should approve your expenditure.");System.out.print(">");doubled=Double.parseDouble(newBufferedReader(newInputStreamReader(System.in)).readLine());manager.processRequest(newPurchaseRequest(d,"General"));}}catch(Exceptione){System.exit(1);}}}

Altri progetti

[modifica |modifica wikitesto]

Altri progetti

V · D · M
Design pattern
CreazionaliAbstract factory ·Builder ·Factory ·Prototype ·Singleton
StrutturaliAdapter ·Bridge ·Composite ·Container pattern ·Decorator ·Façade ·Flyweight ·Proxy
ComportamentaliChain-of-responsibility ·Command ·Interpreter ·Iterator ·Mediator ·Memento ·Observer ·State ·Strategy ·Template method ·Visitor
Pattern di concorrenzaActive object ·Balking ·Binding properties ·Double-checked locking ·Event-based asynchronous ·Guarded suspension ·Join ·Lock ·Monitor ·Proactor ·Reactor ·Read write lock ·Scheduler ·Thread pool ·Thread-local storage
Pattern architetturaliFront controller ·Interceptor ·MVC ·n-tier ·Specification ·Publish–subscribe ·Naked objects ·Service locator ·Active record ·Identity map ·Data Access Object ·Data transfer object ·ADR ·Inversione del controllo
Altri
pattern
Blackboard ·Business delegate ·Composite entity ·Dependency injection ·Intercepting filter ·Lazy loading ·Mock object ·Null object ·Object pool ·Servant ·Twin ·Type tunnel
LibriDesign Patterns ·Enterprise Integration Patterns
PersoneChristopher Alexander ·Erich Gamma ·Ralph Johnson ·John Vlissides ·Grady Booch ·Kent Beck ·Ward Cunningham ·Martin Fowler ·Robert Martin ·Jim Coplien ·Douglas Schmidt ·Linda Rising
ComunitàThe Hillside Group ·The Portland Pattern Repository
  Portale Informatica: accedi alle voci di Wikipedia che trattano di informatica
Estratto da "https://it.wikipedia.org/w/index.php?title=Chain-of-responsibility_pattern&oldid=142936945"
Categoria:
Categorie nascoste:

[8]ページ先頭

©2009-2025 Movatter.jp