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

  1. La taula dels onze
  2. Les parelles que es confonen, cara a cara
  3. Guia de decisió
  4. Combinacions freqüents
  5. El mòdul 4 al mapa de PideYa
  6. Exercicis i conclusió
  7. 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 PanellGestio apila ordres; les ordres difícils guarden mementos del seu receiver.
  • Observer + Mediator: la CentralRepartiment pot assabentar-se dels canvis d'estat de la comanda com un observador més (transitarA notifica) 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:

  1. Entra la comanda → la cadena de validació (GestorFrauGestorZonaRepartimentGestorEstocGestorQuantiaMinima) l'aprova o rebutja, muntada per configuració i disparada per la FacanaCheckoutChain of Responsibility.
  2. Es calcula l'enviament amb la CalculEnviament del mercat (distància, plana, gratis per promoció), i les promocions s'avaluen amb les ExpressioRegla que màrqueting escriu com a text — Strategy i Interpreter.
  3. El client edita la cistella amb punts de retorn: Cistella.Memento a l'HistorialCistellaMemento.
  4. La comanda viu el seu cicle: EstatComanda autoritza cada transició (CREADA → PAGADA → EN_PREPARACIO → EN_REPARTIMENT → LLIURADA / CANCELLADA) — State — i cada transició legal es difon a NotificadorClient, NotificadorRepartidor, MonitorCuina i PanellEstadistiquesObserver, saldant el deute de la lliçó 01-01.
  5. El restaurant gestiona des del seu panell amb Ordres apilables, desfeibles i encuables — Command.
  6. El repartiment es coordina en estrella: CentralRepartiment media entre cuina, comandes i repartidors, amb l'EstrategiaAssignacio intercanviable — Mediator + Strategy.
  7. La carta s'explota: recorreguda amb Iterable<Plat> (cercador, streams) i operada per VisitantCarta (exportació, al·lèrgens, auditoria) — Iterator i Visitor.
  8. Cada nit, els informes de tancament segueixen l'esquelet d'InformeTancament amb 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è):

  1. "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."
  2. "L'assistent d'onboarding de restaurants té 6 pantalles amb el mateix flux (validar → desar → següent) i passos diferents per pantalla."
  3. "Volem que suport pugui revertir les últimes 10 accions fetes sobre una comanda, amb auditoria de qui va fer què."
  4. "La tarifa de la comissió es calcula diferent per a restaurants premium, estàndard i nous, triada pel seu contracte."
  5. "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:

  1. Observer — interessats variables i anònims davant d'un canvi. (Descartat Mediator: ningú no dirigeix un protocol; cadascú reacciona al que és seu.)
  2. Template Method — flux fix, passos variables per pantalla. (Descartat Strategy: no varia l'algorisme sencer ni cal canviar-lo en calent.)
  3. Command (+ Memento per a les accions sense inversa neta) — peticions reïficades amb històric, undo i auditoria.
  4. 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.)
  5. 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

Mòdul 2: Patrons Creacionals

Mòdul 3: Patrons Estructurals

Mòdul 4: Patrons de Comportament

Mòdul 5: Aplicació de Patrons de Disseny

Mòdul 6: Patrons de Disseny Avançats

Mòdul 7: Recursos Addicionals i Conclusió

© Copyright 2026. Tots els drets reservats