Per il modello di strategia, perché abbiamo bisogno di una classe di contesto per chiamare l'algoritmo appropriato? Perché non possiamo semplicemente fare Strategy s = new OperationAdd()
? In questo modo, utilizziamo ancora il polimorfismo.
In alcune lingue, in particolare C # e Java, è possibile definire strategie, non l'algoritmo di ordinamento, ma il modo in cui gli oggetti ordinati vengono confrontati per scopi di ordine.
Ad esempio, in C #, potresti dire qualcosa come
var sort = new MergeSort(new ImaginaryNumberComparator());
e MergeSort tratterà gli oggetti ordinati come numeri immaginari ai fini dell'ordine.
Tuttavia, la modifica dell'algoritmo di ordinamento richiede la conoscenza dell'intera raccolta, non solo di due dei suoi membri.
Il diagramma delle classi UML nell'articolo di Wikipedia mostra Context
per includere la strategia per composizione. Quindi, la classe, tu usi Strategy
dentro, IS un contesto.
class MyClass() {
public function sort() {
SortStrategy s=new MergeSort();
}
}
Qui MyClass
è un contesto per la strategia.
Nei modelli di strategia, la classe Context
è la classe che possiede l'oggetto (concreto) Strategy
.
Il motivo per cui chiamare la classe Context
piuttosto che Client
(o qualcosa di simile) è perché il Pattern Strategico è formulato in modo tale che questa classe fornisca le informazioni contestuali necessarie alle varie implementazioni della Strategia.
Se si dispone di una strategia di ordinamento, il modello di strategia indica che la classe che contiene l'algoritmo di ordinamento da utilizzare passerà anche la raccolta che deve essere ordinata alla strategia di ordinamento e qualsiasi oggetto / funzione di confronto che potrebbe essere necessario.
Leggi altre domande sui tag design design-patterns object-oriented-design strategy