Onze patrons en onze lliçons: la família més nombrosa del catàleg, i també la més confusible — mitja dotzena dels seus membres comparteixen diagrama i es distingeixen només per la intenció. Aquesta lliçó és el mapa final del mòdul: la taula completa, els cinc acaraments que resolen el 90% dels dubtes reals, un flowchart de decisió, les combinacions que treballen en equip, i el repàs de què va quedar instal·lat a cada racó de PideYa. En acabar-la, el catàleg GoF sencer —creacionals, estructurals i de comportament— serà a la teva caixa d'eines.
Contingut
- La taula dels onze
- Les parelles que es confonen, cara a cara
- Guia de decisió
- Combinacions freqüents
- El mòdul 4 al mapa de PideYa
- Exercicis i conclusió
- Tancament: el catàleg està complet
La taula dels onze
| Patró | Reïfica... | Pregunta que respon | A PideYa |
|---|---|---|---|
| Chain of Responsibility | El camí d'una petició | Qui d'aquests ha d'atendre això? | GestorComanda: frau → zona → estoc → mínim |
| Command | Una petició | Com encuo, registro o desfaig una acció? | Ordre del panell: acceptar, cancel·lar, macro |
| Interpreter | Frases d'un llenguatge | Com avaluo regles escrites com a text? | ExpressioRegla: "total > 30 I dia == DIVENDRES" |
| Iterator | Un recorregut | Com recorro això sense conèixer-ne les tripes? | IteradorProfunditatCarta, historial paginat |
| Mediator | Un protocol de coordinació | Com col·laboren molts sense conèixer-se? | CentralRepartiment: cuina ↔ repartidors |
| Memento | Una instantània d'estat | Com guardo i restauro sense exposar? | Cistella.Memento, punts de restauració de la carta |
| Observer | Una subscripció | Com s'assabenten molts que un ha canviat? | ObservadorComanda: client, repartidor, cuina, estadístiques |
| State | Una etapa del cicle de vida | Què puc fer ara mateix? | EstatComanda: CREADA → ... → LLIURADA |
| Strategy | Un algorisme | De quina d'aquestes maneres ho faig? | CalculEnviament, EstrategiaAssignacio |
| Template Method | L'esquelet d'un algorisme | Com fixo el flux i vario passos? | InformeTancament: carregar → agregar → formatar → distribuir |
| Visitor | Una operació sobre una estructura | Com afegeixo operacions sense tocar els nodes? | VisitantCarta: exportar, al·lèrgens, auditoria |
La columna "reïfica" no és ornament: és el resum del mòdul. Els onze apliquen el mateix moviment —convertir en objecte un aspecte de la conducta— i es distingeixen per què converteixen.
Les parelles que es confonen, cara a cara
State vs. Strategy
Bessons estructurals (context que delega en una interfície amb variants); intenció oposada:
| State | Strategy | |
|---|---|---|
| Qui canvia l'objecte delegat | Els estats mateixos, en transitar | L'exterior (config, client), quan vol |
| Les variants es coneixen entre si? | Sí: cada estat sap a quins es va | No: cada estratègia ignora les seves germanes |
| Hi ha graf de transicions | Sí (dibuixa l'stateDiagram) | No: cap càlcul no "transita" a un altre |
Prova del cotó: si l'objecte delegat se substitueix a si mateix des de dins, és State; si el trien des de fora i les variants no formen cicle de vida, és Strategy.
Command vs. Strategy
Tots dos encapsulen "codi en un objecte":
| Command | Strategy | |
|---|---|---|
| Encapsula | Que es va demanar una cosa: la crida amb els seus arguments i receiver | Com es fa una cosa: l'algorisme, sense petició concreta |
| Vida típica | Es crea per petició; s'encua, apila, audita, desfà | Viu el que viu el context; s'invoca mil vegades |
| Interfície típica | executar() sense arguments (tot va a dins) |
calcular(dades) amb arguments (les dades arriben de fora) |
Prova del cotó: mira la firma. Si el mètode no necessita arguments perquè l'objecte ja porta la petició completa a dins, és Command; si rep les dades a cada crida, és Strategy.
Observer vs. Mediator
Tots dos desacoblen comunicació:
| Observer | Mediator | |
|---|---|---|
| Topologia | Difusió: un emet, N anònims escolten | Estrella: N col·legues parlen amb un centre que dirigeix |
| Hi ha protocol? | No: cada observador reacciona pel seu compte, sense ordre garantit | Sí: el mediador decideix qui fa què i quan |
| L'emissor, espera resposta/coordinació? | No: "ha passat això", i segueix | Sí: l'avís dispara decisions sobre altres |
| Afegir un interessat | Subscriure'l; ningú més no se n'assabenta | El mediador probablement ha de conèixer el seu paper |
Prova del cotó: el qui avisa necessita que algú decideixi què passa després (Mediator), o només que qui vulgui se n'assabenti (Observer)?
Template Method vs. Strategy
L'acarament herència/composició:
| Template Method | Strategy | |
|---|---|---|
| Varia | Passos d'un flux fix | L'algorisme sencer |
| Mecanisme | Herència; es decideix en instanciar | Composició; intercanviable en execució |
| Combinar eixos de variació | Malament (subclasse per combinació) | Bé (una estratègia per eix) |
Prova del cotó: necessites canviar la variant en calent o combinar eixos? Composició (Strategy). Flux fix, variants poques i estables que comparteixen context? Plantilla.
Chain of Responsibility vs. Decorator
L'acarament entre famílies (ho vam prometre al mòdul 3): tots dos són objectes enllaçats amb la mateixa interfície que deleguen al següent.
| Chain of Responsibility | Decorator | |
|---|---|---|
| Delegació | Condicional: cada baula decideix atendre, tallar o passar | Incondicional: cada capa sempre crida l'embolcallat |
| Les baules/capes | Fan coses equivalents (variants d'"atendre") | Afegeixen responsabilitats diferents sobre un nucli |
| Pot no arribar al final | Sí, per disseny (tall, veto) | No: la crida travessa totes les capes |
| Intenció | Trobar qui atén / filtrar | Sumar comportament conservant la interfície |
Prova del cotó: algun element pot legítimament tallar la cadena? Chain. Tots aporten sempre la seva capa? Decorator.
Guia de decisió
L'arbre de preguntes per orientar-se (com tota guia: brúixola, no llei — confirma després contra l'acarament corresponent):
flowchart TD
A[Quin és el teu problema de conducta?] --> B{Va d'avisar<br/>o coordinar objectes?}
A --> C{Va d'encapsular<br/>una petició o operació?}
A --> D{Va de variar<br/>un comportament?}
A --> E{Va d'operar sobre<br/>una estructura d'objectes?}
B --> B1{Difondre un canvi a<br/>interessats anònims?}
B1 -- Sí --> OBS[Observer]
B1 -- "No: hi ha protocol<br/>a dirigir" --> MED[Mediator]
C --> C1{Encuar, desfer,<br/>auditar la petició?}
C1 -- Sí --> CMD[Command]
C1 -- "No: cercar qui<br/>l'atén / filtrar-la" --> COR[Chain of Responsibility]
C1 -- "No: l'escriuen com a<br/>text d'un minillenguatge" --> INT[Interpreter]
D --> D1{Depèn de l'estat intern,<br/>amb transicions?}
D1 -- Sí --> STA[State]
D1 -- No --> D2{Varia l'algorisme sencer<br/>o passos d'un flux fix?}
D2 -- Sencer --> STR[Strategy]
D2 -- Passos --> TM[Template Method]
E --> E1{Només recórrer-la?}
E1 -- Sí --> ITE[Iterator]
E1 -- "No: afegir operacions<br/>per tipus de node" --> VIS[Visitor]
E --> E2{Guardar i restaurar<br/>el seu estat?}
E2 -- Sí --> MEM[Memento]
I el recordatori de sempre, herència de la lliçó de la balança: la primera opció vàlida és cap. Un if, una crida directa o un enum segueixen sent la resposta correcta quan el símptoma no ha aparegut.
Combinacions freqüents
Els patrons de comportament treballen en equip millor que cap altra família:
- Command + Memento: el duo de l'undo robust — inversa quan és simètrica i barata, foto quan la inversa menteix. El
PanellGestioapila ordres; les ordres difícils guarden mementos del seu receiver. - Observer + Mediator: la
CentralRepartimentpot assabentar-se dels canvis d'estat de la comanda com un observador més (transitarAnotifica) i dirigir la reacció com a mediadora — difusió per assabentar-se, protocol per actuar. - Composite + Iterator + Visitor: el trio de les estructures — Composite defineix l'arbre de la carta, Iterator el recorre sense exposar-lo, Visitor hi afegeix operacions sense tocar-lo. Tres lliçons, una sola carta.
- State + Observer: State autoritza les transicions de la comanda; Observer difon les que ocorren. Connectats en un sol punt:
transitarA. - Mediator + Strategy: el mediador orquestra; els seus criteris variables (assignació de repartidor) són estratègies injectades.
- Template Method + Strategy/Bridge: el flux fix per herència, els eixos que canvien en calent per composició — l'exercici final de Template Method sobre les
Notificacio. - Chain + Command: per la cadena hi poden viatjar ordres: la petició reïficada busca el seu manipulador.
- Interpreter + Visitor + Flyweight: sobre l'AST de regles — avaluar/imprimir/optimitzar com a visitants, terminals repetits compartits.
Fixa't en la constant: les combinacions no es dissenyen "per catàleg" — sorgeixen del fet que cada patró resol el seu símptoma i els símptomes conviuen al mateix sistema.
El mòdul 4 al mapa de PideYa
El repàs aplicat, seguint el viatge d'una comanda:
- Entra la comanda → la cadena de validació (
GestorFrau→GestorZonaRepartiment→GestorEstoc→GestorQuantiaMinima) l'aprova o rebutja, muntada per configuració i disparada per laFacanaCheckout— Chain of Responsibility. - Es calcula l'enviament amb la
CalculEnviamentdel mercat (distància, plana, gratis per promoció), i les promocions s'avaluen amb lesExpressioReglaque màrqueting escriu com a text — Strategy i Interpreter. - El client edita la cistella amb punts de retorn:
Cistella.Mementoa l'HistorialCistella— Memento. - La comanda viu el seu cicle:
EstatComandaautoritza cada transició (CREADA → PAGADA → EN_PREPARACIO → EN_REPARTIMENT → LLIURADA / CANCELLADA) — State — i cada transició legal es difon aNotificadorClient,NotificadorRepartidor,MonitorCuinaiPanellEstadistiques— Observer, saldant el deute de la lliçó 01-01. - El restaurant gestiona des del seu panell amb
Ordres apilables, desfeibles i encuables — Command. - El repartiment es coordina en estrella:
CentralRepartimentmedia entre cuina, comandes i repartidors, amb l'EstrategiaAssignaciointercanviable — Mediator + Strategy. - La carta s'explota: recorreguda amb
Iterable<Plat>(cercador, streams) i operada perVisitantCarta(exportació, al·lèrgens, auditoria) — Iterator i Visitor. - Cada nit, els informes de tancament segueixen l'esquelet d'
InformeTancamentamb els seus passos per format — Template Method.
Exercicis
Exercici 1: diagnòstic exprés
Per a cada símptoma, anomena el patró (i, si has dubtat entre dos, quin has descartat i per què):
- "Quan el repartidor marca 'lliurada', han de reaccionar l'app del client, la facturació i les mètriques — i el mes que ve, el programa de punts."
- "L'assistent d'onboarding de restaurants té 6 pantalles amb el mateix flux (validar → desar → següent) i passos diferents per pantalla."
- "Volem que suport pugui revertir les últimes 10 accions fetes sobre una comanda, amb auditoria de qui va fer què."
- "La tarifa de la comissió es calcula diferent per a restaurants premium, estàndard i nous, triada pel seu contracte."
- "Un ajust de preu passa per: validació automàtica → aprovació del gestor de zona → aprovació de finances si supera el 10%."
Exercici 2: l'acarament en codi
Sense mirar les lliçons: escriu les dues "proves del cotó" que usaries davant d'un codi dubtós entre (a) State i Strategy, (b) Chain i Decorator. Després aplica (a) a aquest cas: CalculadoraImpostos rep al constructor un RegimFiscal que no canvia mai després de construir-se i les variants del qual (RegimGeneral, RegimSimplificat) no es coneixen entre si.
Exercici 3: combinar amb criteri
L'equip vol "desfer" també a l'edició de la carta del restaurant: cada operació de l'editor (rebatejar secció, canviar preu, moure plat) s'ha de poder revertir, i "reequilibrar preus" (massiu, amb arrodoniments) també. Dissenya la solució anomenant els patrons que combinaries i quin paper juga cadascun.
Solucions
Solució 1:
- Observer — interessats variables i anònims davant d'un canvi. (Descartat Mediator: ningú no dirigeix un protocol; cadascú reacciona al que és seu.)
- Template Method — flux fix, passos variables per pantalla. (Descartat Strategy: no varia l'algorisme sencer ni cal canviar-lo en calent.)
- Command (+ Memento per a les accions sense inversa neta) — peticions reïficades amb històric, undo i auditoria.
- Strategy — algorismes alternatius triats des de fora (el contracte), sense transicions entre ells. (Descartat State: un règim no "transita" a un altre per les operacions.)
- Chain of Responsibility — la petició escala per manipuladors que l'aproven o la passen, amb baules condicionals (finances només de vegades). (Descartat Decorator: hi ha tall i condició, no capes que sempre sumen.)
Solució 2: (a) l'objecte delegat se substitueix a si mateix des de dins, seguint un graf de transicions? → State; el tria l'exterior i les variants s'ignoren? → Strategy. (b) algun element pot legítimament tallar la cadena? → Chain; tots aporten sempre la seva capa? → Decorator. El cas: Strategy — el fixa l'exterior en construir, sense transicions ni coneixement mutu. (Que "no canviï mai després de construir-se" no el converteix en una altra cosa: la intercanviabilitat és entre instàncies del context, no necessàriament en calent.)
Solució 3: Command com a columna vertebral: cada operació de l'editor és una Ordre amb executar()/desfer(), apilada en un invoker amb pila (el patró del PanellGestio). Les operacions simples i simètriques (rebatejar) desfan per inversa; "reequilibrar preus" desfà per Memento — el seu executar() captura abans una instantània de la carta (còpia profunda del Composite, disciplina Prototype) i el seu desfer() la restaura. Opcional i coherent: els canvis confirmats es difonen per Observer (la memòria cau ProxyCacheCataleg i el cercador volen assabentar-se'n). Command dona el marc uniforme; Memento entra només on la inversa no arriba — combinar és assignar a cada patró el seu símptoma, no apilar-los per gust.
Conclusió
Ja distingeixes els onze per la intenció, que és l'única cosa que de vegades els separa: saps què reïfica cadascun, tens els cinc acaraments amb les seves proves del cotó, l'arbre de decisió per orientar-te i les combinacions que funcionen perquè cada peça ataca el seu propi símptoma. I PideYa va quedar com a demostració vivent: de la cadena que filtra comandes al visitant que audita la carta, cada patró del mòdul està instal·lat on el seu mal el reclamava.
Tancament: el catàleg està complet
Els 23 patrons del GoF són ara a la teva caixa d'eines: els creacionals van resoldre el naixement dels objectes, els estructurals la seva anatomia, i els de comportament les seves converses — qui avisa qui, on viuen els algorismes, com es desfà el que s'ha fet. Fins i tot el deute més antic del curs, aquell canviarEstat de la primera lliçó, va quedar saldat per Observer amb State vigilant la porta.
Però conèixer el catàleg no és saber usar-lo — és la diferència entre tenir les eines i ser bon fuster. Les preguntes que venen ara són les difícils: com es tria patró davant d'un problema real que no arriba etiquetat? Com es refactoritza codi viu cap a un patró sense trencar-lo? Quan un patró ben aplicat es converteix en un antipatró? Quins patrons usen de debò Spring, el JDK o el codi de la teva empresa? Aquest és l'ofici, i és el mòdul sencer que comença: ens veiem a Com Seleccionar el Patró Adequat.
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
