Un semplice indicatore di quando un modello dovrebbe migliorare il tuo codice, è quando vedi che il tuo codice richiede spesso di lanciare un oggetto su un tipo diverso. Un esempio che ho trovato nel mio codice Java, che mi ha indotto a convertire una firma di metodo esistente in un modello:
public MsgBase getLastSentMessage(Class<? extends MsgBase> msgBaseClass)
Il mio codice cliente ha sempre avuto questo aspetto:
OrderResponse response = (OrderResponse) getLastSentMessage(OrderResponse.class);
e ogni volta che ho usato quel metodo, ho dovuto trasmettere il risultato alla sottoclasse corretta del tipo MsgBase. La firma del metodo migliorata era:
public <T extends MsgBase> T getLastSentMessage(Class<T> clazz)
Ora il codice cliente era:
OrderResponse response = getLastSentMessage(OrderResponse.class);
Quindi, per riassumere, se ti trovi a fare un sacco di casting che sembra non necessario, potresti avere un buon caso in cui un modello pulirà il tuo codice.
Aggiornamento: un modo migliore per generalizzare l'affermazione precedente:
When your source class will be used by objects of many different types, and the source class can interact with those types at a higher (more abstract) level, but your client classes want to interact with specific subtypes, that is a case for using templates. (Container/List classes being the well-known example).