Come creare famiglie di classi correlate che implementano un'interfaccia comune?
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.
É consentita o è necessaria una sola istanza di una classe. Le altre classi necessità di un accesso globale all'istanza (singola, singleton) di tale classe.
Definire un metodo statico nella classe singleton che restituisce l'istanza dell'oggetto singleton.
In genere le factory sono degli oggetti che hanno una singola istanza, per questo fanno uso del pattern Singleton.
Come gestire interfacce incompatibili, o fornire un'interfaccia stabile a comportamenti simili, ma con interfacce diverse?
Convertire l'interfaccia originale di un componente in un'altra interfaccia, attraverso un adattatore intermedio.
Come progettare per gestire un insieme di algoritmi/strategie/politiche variabili, ma correlate? Come consentirne le modifiche?
Definire una classe per ogni strategia/algoritmo/politica in modo che implementino un'interfaccia comune.
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.
Come trattare gruppo o una struttura composta di oggetti (polimorficamente) dello stesso tipo nello stesso modo di un oggetto non composto?
Definire le classi per gli oggetti composti e atomici in modo che implementino la stessa interfaccia.
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.
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?
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.
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.
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.
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.
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.
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.