Realizzazione decoratore generica

2

Ho il seguente schema, che vorrei implementare usando un qualche tipo di programmazione generica, ma non vedo come posso farlo.

Ho un'interfaccia che contiene molti metodi con diverse firme. Ogni metodo ha un tipo restituito di un tipo di classe e qualsiasi implementazione deve restituire null in caso di errore o un oggetto concreto in caso di successo.

Ora ho un'implementazione concreta A di I e una decorator classe D di A. Per ogni metodo

T m(T1 p1, ..., Tn pn)

definito dall'interfaccia I, l'implementazione di m in D segue uno schema fisso:

class D
{
    private A impl = ...;

    ...

    T D.m(t1 p1, t2 p2, ..., tn pn)
    {
        init();

        T result = impl.m(p1, ..., pn);
        if (result != null)
            successCode();
        else
            failureCode();

        return result;
    }
}

Il codice chiamante utilizza il decoratore come segue:

I instance = DecoratorFactory.createIDecorator();
T r        = instance.m(p1, ..., pn);

Domanda: C'è un modo per implementare questo tipo di decoratore in un generico modo (senza scrivere la stessa piastra per ogni metodo)? Questo può essere fatto in Java?

Se non è possibile implementare questo modello in Java, è lì un modo elegante per implementarlo in un'altra lingua?

    
posta Giorgio 17.02.2012 - 17:09
fonte

2 risposte

5

Quello che stai probabilmente cercando è chiamato Aspect Oriented Programming. Funziona con il Proxy-Pattern, che è proprio quello di cui hai bisogno.

Puoi creare un proxy dinamico per ogni oggetto e dire a quel proxy di intercettare le chiamate ed eseguire la tua logica. Tutto ciò di cui hai bisogno è una classe proxy dinamica che contenga la tua logica di intercettazione. Si avvolgerà attorno a qualsiasi oggetto che gli dai e cercherà di eseguire la tua logica.

Inizia a cercare qui:

Non ho letto quegli articoli, però. Basta navigare sul web per l'implementazione / libreria che si adatta meglio alle tue esigenze.

Potresti anche controllare AspectJ .

    
risposta data 17.02.2012 - 18:20
fonte
1

Non sorprende che non si possa vedere come farlo in Java. Java non supporta questo tipo di cose in alcun modo ragionevole, quindi le soluzioni sono complesse e coinvolgono la magia profonda. Questo è un problema semplice in lingue dinamiche.

Tutto ciò che serve è un gestore per le chiamate ai metodi mancanti e un modo per definire i metodi in fase di esecuzione.

Quindi la classe decoratore definisce semplicemente un gestore di metodo mancante che creerà i wrapper in fase di esecuzione al primo richiamo. In Ruby è necessario circa una dozzina di righe di codice.

    
risposta data 17.02.2012 - 17:50
fonte

Leggi altre domande sui tag