Ho visto l'implementazione delle cache usando un pattern Proxy. In particolare i framework come AOP utilizzano i proxy per la maggior parte di queste cose.
Secondo il libro Modelli di design ed elementi del software orientato agli oggetti riutilizzabile il decoratore e il modello proxy possono sembrare uguali /
Pagina 216:
"Although decorators may have similar implementations as proxies,
decorators have a different purpose. A decorator adds one or more
responsibilities to an object, whereas a proxy controls access to an
object.
Proxies vary in the degree to which they are implemented like a
decorator.A protection proxy might be implemented exactly like a
decorator. On the other hand, a remote proxy will not contain a direct
reference to its real subject but only an indirect reference, such as
a "host ID and local address on the host". A virtual proxy will start
off with an indirect reference such as a file name but will eventually
obtain and use a direct reference"
Sembra che il tuo scopo con la cache sia di evitare di dare accesso diretto al soggetto reale, quindi suona più come un proxy per me.
Il commento sopra chiaramente rende evidente che un'importante differenza tra un delegato e un decoratore è che il delegato può essere responsabile dell'istanziazione o dell'accesso al soggetto reale, mentre nel caso del decoratore ci si aspetta che tale il riferimento verrà fornito dinamicamente.
Sembrerebbe che la relazione tra il proxy e il soggetto reale sia più statica che nel caso del decoratore.
Detto questo, in definitiva nel tuo caso è una questione di intenti più di come sarà il design. Alla fine la soluzione è avere un oggetto wrapper (chiamato Proxy o Decorator) che intercetterà il metodo e ti permetterà di controllare quando accedere a una cache o meno in base al criterio della cache.