In un proxy GoF tradizionale, si dispone di un'interfaccia, un'implementazione che implementa l'interfaccia e un proxy che implementa anche l'interfaccia, fa riferimento a un'istanza di implementazione e delega le chiamate sui metodi dell'interfaccia agli stessi metodi in l'istanza di implementazione.
Supponiamo che chiamerai la coppia Interfaccia / Implementazione come un "frammento" e ne avresti diverse diverse. Ora immagina di creare un'intera interfaccia che implementa tutte le interfacce Fragment e un singolo proxy intero che ha implementato l'Interfaccia intera e che è stata delegata all'istanza di Implementazione frammento appropriata.
Esempio di codice (Java):
// Fragment A:
interface FragmentA { ... }
class FragmentAImpl implements FragmentA { ... }
// Whole A. That is the interface that "clients use"
interfaces WholeA extends FragmentA { // EMPTY! }
// *automatically generated* Proxy:
class ProxyA implements WholeA {
private FragmentA implA;
// Implements FragmentA through delegation to implA
}
// Fragment B:
interface FragmentB { ... }
class FragmentBImpl implements FragmentB { ... }
// Whole B. That is the interface that "clients use"
interfaces WholeB extends WholeA, FragmentB { // EMPTY! }
// *automatically generated* Proxy:
class ProxyB extends ProxyA implements WholeB {
private FragmentB implB;
// Implements FragmentB through delegation to implB
}
// Fragment C: similar to Fragment B, but with different *added behavior*.
Questo modello è (dato che i Pattern devono essere una soluzione comune ai problemi comuni)? E se sì, come ha un nome? O potrebbe essere definito chiaramente come una combinazione di modelli?
Essere in grado di descrivere chiaramente come funziona questo codice in termini di pattern renderebbe molto più facile spiegare agli altri come creare codice compatibile e aiutare a trovare un framework che già implementa questo pattern.
Un Proxy normalmente delegati a una singola istanza .
Un Facade normalmente offre una diversa interfaccia a quel più oggetti che nasconde.
Un Bridge offre anche una diversa interfaccia a quella singola istanza che nasconde.
Un Composito si aspetta che tutti i componenti condividano la stessa interfaccia di base .
Un Decoratore estende l'interfaccia dell'oggetto avvolto, come qui, ma normalmente implementa la funzionalità aggiuntiva stessa , invece di delegare a un altro oggetto.
Un intero che implementa un singolo frammento è solo un pattern Proxy, ma un intero che estende un altro è più vicino a un pattern Decorator.
Ci sono diversi motivi per farlo in questo modo. In primo luogo, il codice client dovrebbe vedere WholeB come estensione di WholeA, sebbene l'implementatore di FragmentB non possa estendere FragmentA (che è stato implementato da qualcun altro). In secondo luogo, i riferimenti a WholeX (ProxyX) rimangono validi, anche se l'implementazione di FragmentX viene sostituita da un runtime. In terzo luogo, sia ProxyB che ProxyC possono condividere la stessa istanza di FragmentAImpl.