Supponiamo che disponga di un'interfaccia semplice per la traduzione di testo (codice di esempio in C #):
public interface ITranslationService
{
string GetTranslation(string key, CultureInfo targetLanguage);
// some other methods...
}
Una prima semplice implementazione di questa interfaccia esiste già e va semplicemente al database per ogni chiamata di metodo. Supponendo che un'interfaccia utente che viene tradotta all'avvio restituisca una chiamata al database per controllo.
Per migliorare questo, voglio aggiungere il seguente comportamento:
As soon as a request for one language comes in, fetch all translations from this language and cache them. All translation requests are served from the cache.
Ho pensato di implementare questo nuovo comportamento come decoratore, perché tutti gli altri metodi di quell'interfaccia implementati dal decoratore sarebbero stati delegati all'istanza decorata.
Tuttavia, l'implementazione di GetTranslation
non userebbe GetTranslation
dell'istanza decorata affatto per ottenere tutte le traduzioni di una certa lingua. Avrebbe generato una sua query sul database.
Questo rompe il modello decoratore, perché ogni funzionalità fornita dall'istanza decorata viene semplicemente saltata. Questo diventa un vero problema se ci sono altri decoratori coinvolti.
La mia comprensione è che un decoratore dovrebbe essere additivo. In questo caso, tuttavia, il decoratore sostituisce il comportamento dell'istanza decorata.
Non riesco davvero a pensare ad una bella soluzione per questo - come lo risolveresti? Tutto è permesso, anche un completo riprogettazione di ITranslationService
stesso.