Strategia vs delegati

4

Il modello di progettazione Strategy sostituisce interamente delegates ?

In Java , ad esempio, non ci sono delegati. È possibile ottenere tutte le funzionalità di delegates utilizzando Strategy motivo di progettazione?

Modifica : vedo che c'è qualche ambiguità nella mia domanda. Per delegates intendo la funzione della lingua, C # per esempio.

    
posta superM 05.07.2012 - 13:33
fonte

2 risposte

3

Is it possible to gain all the features of delegates by using Strategy design pattern?

Non esattamente.

In C #, i delegati vengono utilizzati per implementare il modello di strategia in modo semplice e intuitivo. A volte, la distribuzione virtuale tramite l'ereditarietà viene utilizzata per implementare il modello di strategia perché si adatta meglio al problema. Raramente vengono utilizzati metodi dinamici sovraccaricati.

Java in realtà ha solo il secondo come opzione al momento.

Non è proprio corretto dire che il modello di strategia può fornire un comportamento delegato perché uno è un modello di progettazione e l'altro è un costrutto. L'intera completezza di Turing dice che Java può emulare il comportamento dei delegati, ma un certo numero di caratteristiche del delegato (catturare variabili locali, multi-casting) non rientra in ciò che un modello di strategia risolve.

    
risposta data 05.07.2012 - 14:21
fonte
11

Un delegato è solo una classe senza dati e un metodo. Questo è facile da implementare in quasi tutti i linguaggi OO, inclusi anche C # e certamente Java.

C # (utilizzando un delegato):

public delegate bool Test( int, int );
// And in some other class/method:
    SortEm.sort( ilist, (a, b) => a < b );
// And in static class SortEm:
public static void sort( int[] list, Test test )  {
    ...
    if (test( x, y ))  {
    ...
}

Java:

public interface JDelegate  {
    public boolean test( int a, int b );
}
// And in some other class/method:
    SortEm.sort( ilist,
        // Anonymous Class
        new JDelegate()  {
            @Override public boolean test( int a, int b )  { return a < b; }
        }
    );
// And in class SortEm:
public static void sort( int[] list, JDelegate sorter )  {
    ...
    if (sorter.test( x, y ))  {
    ...
}

Java ha bisogno di un po 'più di digitazione. Utilizza i concetti esistenti piuttosto che crearne di nuovi ( delegate , ad esempio), il che rende più facile tornare a Java dopo aver trascorso un anno su C. Inoltre, l'interfaccia "JDelegate" può diventare molto più elaborato se necessario, così come la classe effettivamente passata, che potrebbe essere una classe denominata (piuttosto che anonima) che implementa JDelegate.

Il grande margine C # in questo è che la sezione più comunemente usata in questo codice è la chiamata per ordinare - una linea contro quattro, in questo caso. Ma la funzionalità è presente in Java e probabilmente in qualsiasi linguaggio OO.

Fare questo in delegati C # senza è lasciato come esercizio per il lettore.

    
risposta data 05.07.2012 - 16:07
fonte

Leggi altre domande sui tag