Els creacionals van resoldre el naixement dels objectes de PideYa; els estructurals, la seva anatomia. Queda la pregunta que tancava el mòdul anterior, la més dinàmica de les tres: amb els objectes ja creats i ben connectats, com col·laboren en execució? Qui avisa qui quan una comanda canvia d'estat? Com es desfà una acció del panell del restaurant? On viu l'algorisme que decideix quin repartidor porta cada comanda? Els patrons de comportament responen a això: reparteixen responsabilitats entre objectes i organitzen la seva comunicació sense acoblar-los. Són la família més nombrosa del catàleg GoF —onze patrons— i aquesta lliçó n'és el mapa: quin problema comú ataquen, qui és qui, i quins mals concrets de PideYa està esperant cadascun.
Contingut
- El problema comú: col·laborar sense acoblar-se
- Panorama dels onze patrons de comportament
- Àmbit de classe i àmbit d'objecte
- Símptomes a PideYa que cal un patró de comportament
- Com llegirem cada patró en aquest mòdul
- Exercicis i conclusió
El problema comú: col·laborar sense acoblar-se
Els creacionals responien a qui decideix quina classe s'instancia?; els estructurals, a com s'acoblen les peces?. Els patrons de comportament responen a dues preguntes entrellaçades:
- Assignació de responsabilitats: quin objecte ha de fer cada cosa? On viu un algorisme, qui guarda un estat, qui decideix una transició?
- Comunicació: com es parlen els objectes entre si per completar una tasca que cap no pot fer sol?
I l'enemic torna a ser el de sempre amb una tercera cara: l'acoblament, aquest cop a les converses. Al mòdul 2 l'acoblament s'esmunyia pel new; al 3, per les connexions estructurals; aquí s'esmuny per les crides:
- Un objecte que, per fer la seva feina, crida directament tots els interessats en ell (et sona
Comanda.canviarEstat(...)de la primera lliçó del curs? Aquest mòdul salda aquell deute). - Un algorisme cablejat dins de la classe que l'usa, impossible de canviar sense tocar-la.
- Un embull de condicionals (
switchsobre estats,ifsobre tipus) que es repeteix per tot el codi i creix amb cada cas nou. - Objectes que es coneixen tots amb tots per coordinar-se: una malla on tocar-ne un arrossega tots els altres.
- Peticions que només existeixen com a crides efímeres: no es poden encuar, desfer, registrar ni reenviar.
L'estratègia de la família és sempre la mateixa, i ja la coneixes dels principis del mòdul 1: reïficar — convertir en objecte allò que abans era codi solt. Un algorisme esdevé un objecte (Strategy), una petició esdevé un objecte (Command), un estat esdevé un objecte (State), una foto del passat esdevé un objecte (Memento), un recorregut esdevé un objecte (Iterator). Un cop una cosa és un objecte, es pot intercanviar, injectar, encuar, desar i provar. És "programa contra interfícies" i "composició per sobre d'herència" aplicats a la conducta.
Panorama dels onze patrons de comportament
La foto completa del mòdul, cada patró en una línia. No la memoritzis ara: hi tornarem, ampliada i amb acaraments, a la comparativa final.
| Patró | Intenció en una línia |
|---|---|
| Chain of Responsibility | Passar una petició per una cadena de manipuladors fins que algun l'atengui |
| Command | Encapsular una petició com a objecte: encuar-la, registrar-la, desfer-la |
| Interpreter | Definir la gramàtica d'un minillenguatge i un intèrpret que n'avalua les frases |
| Iterator | Recórrer els elements d'una col·lecció sense exposar-ne l'estructura interna |
| Mediator | Centralitzar en un objecte les interaccions molts-a-molts entre col·legues |
| Memento | Capturar l'estat d'un objecte per restaurar-lo després, sense trencar-ne l'encapsulació |
| Observer | Subscripció un-a-molts: quan el subjecte canvia, tots els seus observadors se n'assabenten |
| State | Un objecte el comportament del qual canvia amb el seu estat intern, sense condicionals gegants |
| Strategy | Família d'algorismes intercanviables, encapsulats rere una interfície comuna |
| Template Method | Esquelet d'un algorisme en una classe base amb passos que redefineixen les subclasses |
| Visitor | Afegir operacions noves a una jerarquia estable d'objectes sense modificar-la |
Onze són molts, així que convé agrupar-los mentalment per la conversa que organitzen:
- Encapsular allò variable: Strategy (un algorisme), State (un comportament dependent de l'estat), Command (una petició), Template Method (passos d'un algorisme), Interpreter (frases d'un llenguatge).
- Comunicar sense acoblar: Observer (un avisa molts que no coneix), Mediator (molts parlen a través d'un), Chain of Responsibility (la petició busca qui l'atengui).
- Treballar sobre estructures: Iterator (recórrer-les), Visitor (operar-hi), Memento (fotografiar-les i restaurar-les).
Àmbit de classe i àmbit d'objecte
Com a les famílies anteriors, cada patró té un àmbit: de classe si la col·laboració es fixa amb herència en compilar, o d'objecte si s'estableix amb composició en execució. El recompte aquí és gairebé tan rotund com als estructurals: nou dels onze són d'àmbit d'objecte. Els dos d'àmbit de classe són:
- Template Method: l'esquelet de l'algorisme viu a la superclasse i les subclasses redefineixen passos heretant. És el patró d'herència per excel·lència.
- Interpreter: la gramàtica es plasma en una jerarquia de classes (una classe per regla), fixada en compilar.
Els altres nou componen: el context conté una estratègia, el subjecte conté observadors, l'invocador conté ordres... La parella Template Method / Strategy és l'acarament perfecte d'aquesta diferència —mateix problema, un el resol heretant i l'altre component— i el veurem cara a cara a la seva lliçó.
Símptomes a PideYa que cal un patró de comportament
Com als mòduls anteriors: primer el símptoma, després el patró. Tots aquests mals existeixen avui a PideYa; cadascun té la seva lliçó:
| Símptoma a PideYa | Olor de disseny | Patró que el tracta |
|---|---|---|
Una comanda entrant ha de passar controls (frau, estoc, zona de repartiment, quantia mínima) i avui són un mètode quilomètric d'if imbricats |
Validacions en sèrie cablejades en un sol bloc, impossibles de reordenar o reutilitzar | Chain of Responsibility |
| El panell del restaurant necessita "desfer" (acceptar, cancel·lar, marcar en preparació...) i una cua d'operacions pendents, però cada acció és només una crida a mètode que s'esfuma | Peticions efímeres que no es poden encuar, registrar ni revertir | Command |
| Màrqueting vol escriure regles de promoció ("total > 30 I dia == DIVENDRES") sense desplegar codi | Regles de negoci expressades com a text que algú ha d'avaluar | Interpreter |
| Recórrer la carta Composite obliga cada client a saber que hi ha seccions dins de seccions | Estructura interna exposada a tothom que la vol recórrer | Iterator |
| Comandes llestes, repartidors i cuina es criden entre si per coordinar-se: cada classe coneix totes les altres | Acoblament en malla molts-a-molts | Mediator |
| El client edita la seva cistella i vol "desfer" sense que la cistella exposi les seves tripes | Necessitat de desar i restaurar estat sense trencar l'encapsulació | Memento |
Comanda.canviarEstat(...) crea amb new els serveis de push, SMS i estadístiques — el mal de la lliçó 01-01, encara sense resoldre |
El subjecte coneix i crida tots els seus interessats | Observer |
Què es pot fer amb una comanda depèn de si està creada, pagada, en repartiment...; el codi és un switch sobre l'estat repetit a cada mètode |
Comportament per estat dispers en condicionals duplicats | State |
| Les despeses d'enviament es calculen de tres maneres (distància, tarifa plana, gratis per promoció) triades en execució | Algorismes alternatius cablejats amb condicionals al client | Strategy |
| Els informes de tancament diari repeteixen el mateix flux (carregar → agregar → formatar → distribuir) amb passos diferents segons el format | Algorisme duplicat en variants que només difereixen en alguns passos | Template Method |
Exportar la carta a JSON, calcular al·lèrgens i auditar preus amenacen d'omplir Plat i SeccioCarta de mètodes aliens a la seva responsabilitat |
Operacions noves que obliguen a modificar una jerarquia estable | Visitor |
Com llegirem cada patró en aquest mòdul
Les onze lliçons de patró segueixen l'esquelet dels mòduls anteriors, perquè comparar-los sigui fàcil:
- El problema a PideYa, amb el codi del primer intent (el dolent).
- Estructura: intenció GoF i
classDiagrammermaid amb els rols, com a la lliçó d'UML. En aquesta família hi afegirem sovintsequenceDiagram, perquè el que importa és la conversa en el temps, no només la foto estàtica. - Implementació Java completa, explicada pas a pas.
- Variants rellevants de cada patró.
- Quan usar-lo i quan no, amb l'honestedat de costos habitual.
- Relació amb altres patrons: només mencions amb enllaç.
- Errors comuns, exercicis amb solució i conclusió.
I seguim construint sobre allò construït: la carta Composite del mòdul 3 serà recorreguda per Iterator i visitada per Visitor; el Comanda.Builder del mòdul 2 fabricarà les comandes que Observer vigila i State governa; els Notificador decorats del mòdul 3 seran els receptors finals de les notificacions d'Observer; la FacanaCheckout invocarà la cadena de validació de Chain of Responsibility. Un sol sistema, moltes converses.
Exercicis
Exercici 1: aparellar símptoma i patró
Per a cada situació nova de PideYa, digues quin patró de comportament de la taula sembla apuntar (n'hi ha prou d'aparellar el símptoma amb la intenció d'una línia):
- Quan canvia el preu d'un plat, se n'han d'assabentar el cercador, la memòria cau del catàleg i l'històric de preus — i demà potser algú més.
- El suport vol que una reclamació passi primer pel bot, després per un agent, després per un supervisor, i que cada nivell la resolgui o l'escali.
- Volem provar dues maneres d'ordenar els restaurants a la home (per valoració, per proximitat) i triar-la per configuració.
- En prémer "desar esborrany" d'una carta en edició, el restaurant vol poder tornar més tard exactament a aquell punt.
Exercici 2: reïficar
Aquest mòdul repeteix un truc: convertir en objecte una cosa que abans era codi solt. Indica quina cosa es converteix en objecte en cadascun d'aquests patrons: Strategy, Command, Memento, Iterator, State.
Solucions
Solució 1:
- Observer: un canvi, molts interessats desconeguts i variables.
- Chain of Responsibility: la petició recorre manipuladors fins que un l'atén (o l'escala).
- Strategy: algorismes alternatius i intercanviables rere una interfície comuna.
- Memento: capturar l'estat per restaurar-lo després sense exposar les tripes de l'objecte.
Solució 2: Strategy reïfica un algorisme; Command, una petició (una crida amb els seus arguments); Memento, una instantània d'estat; Iterator, un recorregut (la posició i la lògica d'avanç); State, un estat i el seu comportament associat.
Conclusió
Ja tens el mapa de la família més nombrosa del catàleg: onze patrons que reparteixen responsabilitats i organitzen la comunicació entre objectes sense acoblar-los, gairebé tots mitjançant composició, i gairebé tots aplicant el mateix truc — reïficar la conducta per poder intercanviar-la, encuar-la, desar-la o repartir-la. Saps quin mal de PideYa espera cadascun, inclòs el més antic del curs: aquell canviarEstat de la primera lliçó que fa tres mòduls que espera Observer.
Però comencem per la porta d'entrada del negoci: cada comanda que arriba a PideYa ha de superar una cursa d'obstacles —és frau?, hi ha estoc?, repartim en aquella zona?, arriba a la quantia mínima?— i avui aquesta cursa és un mètode monolític que ningú no vol tocar. La convertirem en una cadena de baules independents i recombinables. Ens veiem a Chain of Responsibility.
Curs de Patrons de Disseny de Programari
Mòdul 1: Introducció als Patrons de Disseny
- Què són els Patrons de Disseny?
- Història i Origen dels Patrons de Disseny
- Principis de Disseny: SOLID i Altres Fonaments
- UML Essencial per Entendre Patrons
- Classificació dels Patrons de Disseny
- Avantatges i Desavantatges d'Usar Patrons de Disseny
Mòdul 2: Patrons Creacionals
- Introducció als Patrons Creacionals
- Singleton
- Factory Method
- Abstract Factory
- Builder
- Prototype
- Comparativa i Elecció de Patrons Creacionals
Mòdul 3: Patrons Estructurals
- Introducció als Patrons Estructurals
- Adapter
- Bridge
- Composite
- Decorator
- Facade
- Flyweight
- Proxy
- Comparativa i Elecció de Patrons Estructurals
Mòdul 4: Patrons de Comportament
- Introducció als Patrons de Comportament
- Chain of Responsibility
- Command
- Interpreter
- Iterator
- Mediator
- Memento
- Observer
- State
- Strategy
- Template Method
- Visitor
- Comparativa i Elecció de Patrons de Comportament
Mòdul 5: Aplicació de Patrons de Disseny
- Com Seleccionar el Patró Adequat
- Exemples Pràctics d'Ús de Patrons
- Patrons de Disseny en Projectes Reals
- Refactorització Usant Patrons de Disseny
- Antipatrons: Quan els Patrons es Tornen un Problema
Mòdul 6: Patrons de Disseny Avançats
- Patrons de Disseny en Arquitectures Modernes
- Patrons de Disseny en Microserveis
- Patrons de Disseny en Sistemes Distribuïts
- Patrons de Concurrència
- Patrons de Disseny en Desenvolupament Àgil
