Pattern GoF
Pattern GRASP

Abstract Factory
...

Problema

Come creare famiglie di classi correlate che implementano un'interfaccia comune?

Soluzione

Definire un'interfaccia Factory.
Definire una classe Factory concreta per ciascuna famiglia di elementi da creare. Opzionalmente creare una classe astratta che implementa la factory e fornisce servizi che sono comuni a tutte le factory concrete, esse estendono tale classe per implementare i servizi comuni senza duplicare codice.

Pasted image 20230630131652.png

Singleton
...

Problema

É consentita o è necessaria una sola istanza di una classe. Le altre classi necessità di un accesso globale all'istanza (singola, singleton) di tale classe.

Soluzione

Definire un metodo statico nella classe singleton che restituisce l'istanza dell'oggetto singleton.

Pasted image 20230703124712.png

In genere le factory sono degli oggetti che hanno una singola istanza, per questo fanno uso del pattern Singleton.

Adapter
...

Problema

Come gestire interfacce incompatibili, o fornire un'interfaccia stabile a comportamenti simili, ma con interfacce diverse?

Soluzione

Convertire l'interfaccia originale di un componente in un'altra interfaccia, attraverso un adattatore intermedio.

Pasted image 20230703125248.png

Strategy
...

Problema

Come progettare per gestire un insieme di algoritmi/strategie/politiche variabili, ma correlate? Come consentirne le modifiche?

Soluzione

Definire una classe per ogni strategia/algoritmo/politica in modo che implementino un'interfaccia comune.

Pasted image 20230703185902.png

Il pattern strategy è moto simile al pattern state, ma c'è un differenza distintiva: il pattern strategy non ha uno stato interno. E non ha bisogno di cambiarlo. Quello che può cambiare in strategy è la strategia, poiché il contesto detiene un riferimento all'interfaccia strategy che diverse strategie concrete possono implementare, il contesto può dinamicamente sostituire la strategia, senza cambiare il suo stato interno.

Composite
...

Problema

Come trattare gruppo o una struttura composta di oggetti (polimorficamente) dello stesso tipo nello stesso modo di un oggetto non composto?

Soluzione

Definire le classi per gli oggetti composti e atomici in modo che implementino la stessa interfaccia.

Pasted image 20230703184248.png

Composite è usato quando ci sono per esempio più strategie, che potrebbero entrare in conflitto, allora si crea una classe Composite che detiene una lista di strategie (che fanno riferimento alla classe astratta per le strategie) ed essa stessa è una strategia, in base ad un ciclo, si possono visualizzare tutte le strategie attualmente disponibili (o che entrano in conflitto) è applicare quella più conveniente.

State
...

Problema

Il comportamento di un oggetto dipende da un suo stato, i suoi metodi utilizzano logica condizionale per decidere le operazioni da svolgere in base allo stato corrente dell'oggetto. C'è alternativa all'uso della logica condizionale?

Soluzione

Definire delle classi stato per ciascuno stato dell'oggetto. Tali stati implementano un'interfaccia comune. Un oggetto contesto mantiene un oggetto stato. Delegare le operazioni che dipendono dallo stato all'oggetto stato corrente (nell'oggetto contesto). Assicurarsi che l'oggetto contesto referenzi sempre un oggetto stato che riflette il suo stato corrente.

Pasted image 20230703192153.png

Generalmente l'oggetto contesto ha un metodo setState(prossimoStato : State) per far si che esso possa cambiare il suo stato interno in un altro stato.

Observer
...

Problema

Diversi tipi di oggetti (subscriber) sono interessati ai cambiamenti di stato o agli eventi generati da un oggetto (publisher). Ogni subscriber vuole reagire a proprio modo in base agli eventi generati dal publisher. Inoltre si vuole mantenere accoppiamento basso verso i subscriber.

Soluzione

Definire una interfaccia subscriber implementata dagli oggetti interessati ai cambiamenti dell'oggetto publisher. L'oggetto publisher mantiene (dinamicamente) un insieme di oggetti subscriber a cui notifica il cambiamento di stato o la generazione di un evento.

Pasted image 20230703201229.png

Decorator
...

Problema

Diversi tipi di oggetti (subscriber) sono interessati ai cambiamenti di stato o agli eventi generati da un oggetto (publisher). Ogni subscriber vuole reagire a proprio modo in base agli eventi generati dal publisher. Inoltre si vuole mantenere accoppiamento basso verso i subscriber.

Soluzione

Definire una interfaccia subscriber implementata dagli oggetti interessati ai cambiamenti dell'oggetto publisher. L'oggetto publisher mantiene (dinamicamente) un insieme di oggetti subscriber a cui notifica il cambiamento di stato o la generazione di un evento.

Pasted image 20230703201229.png