2013-02-22 1 views
5

Ich schaute auf ein Beispiel, wo Delegierung Muster für Java erklärt wird. Habe nicht viel Nutzen dafür gefunden (entschuldige die Unwissenheit), da ich finde, dass es an der Flexibilität in objective-c mangelt. Gibt es eine Möglichkeit, das Delegatobjekt dynamisch so einzurichten, wie es in objective-c möglich ist? Ist das nicht der ganze Sinn der Delegation? Mein Wissen über Java ist sehr vorläufig, bitte erklären Sie es im Detail.Wie Delegate-Muster zu implementieren (wie in Ziel-C) in Java

+0

Die [Java AWT Event-Architektur] (http://docs.oracle.com/javase/1.4.2/docs/guide/awt/1.3/designspec/events.html) beschäftigt das Delegationsmodell. Möglicherweise möchten Sie dem verknüpften Dokument Lesezugriff gewähren. – Perception

+0

@Perception: Ich habe den Link überprüft. Im angegebenen Codebeispiel ist es nicht notwendig, dass der übergebene Delegat immer vom Typ "App" ist. Das meinte ich mit Flexibilität. Oder bin ich völlig falsch, wenn das App-Objekt der Delegierte ist? – Rakesh

+0

Vor ein paar Tagen hier http://stackoverflow.com/questions/14963740/cast-to-implemented-class/14963939#14963939 skizzierte ich das Delegationsmuster mit einem Beispiel, könnten Sie es überprüfen. – gaborsch

Antwort

8

Ich denke, es gibt viele Möglichkeiten, Wege Delegation Muster in Java, aber wahrscheinlich keine, die wie ein eingebautes in fühlt sich zu implementieren.

Werfen Sie einen Blick auf die Wikipedia example. Ihre grundlegende Option ist die manuelle eine Schnittstelle, implementieren und dann einfach uns darauf, die Anrufe auf eine konkrete Instanz, die Sie während der Laufzeit ändern können, so viel wie Sie wollen.

Jetzt abhängig davon, welche Werkzeuge Sie haben und verwenden können, können Sie diese Weiterleitung automatischer machen. Eine Idee ist die aspektorientierte Programmierung wie AspectJ.

mit einer Seite Compiler (oder Laufzeit) Sie Anmerkungen verwenden könnten und kommen mit einer einfachen Erweiterung der Sprache:

class Person { 
    @Delegate Animal animal; 
    ... 
} 

Sie würden dann einen Aspekt zu schreiben, die @Delegate s findet und fügt automatisch Weiterleitungsmethoden in der Klasse (z. B. Person) Schnittstelle.

Wenn Sie in der Lage sind a more groovy JVM language zu verwenden, dann würden Sie nicht einmal eine einzige Zeile Code schreiben müssen, weil solche Sprachen Delegierten in der Standardbibliothek haben:

Sie einen Blick können here, um zu sehen, wie es in Groovy gemacht wird. (Essentialy genau wie die Person Beispiel Syntax kam ich mit ... aber eingebaut!)

2

Dies ist, wie Sie fälschen funktionelles Idiom in Java. Ja, es ist scheußlich. Wenn Sie elegante funktionale Idiome wünschen, verwenden Sie eine Sprache, die Funktionen wie rothaarige Stiefkinder nicht behandelt. Wenn Sie mehr Sicherheit bei der Kompilierung wünschen, können Sie natürlich spezifischere Schnittstellendefinitionen verwenden, so dass Sie keine Programmierfehler mit IndexOutOfBounds und ClassCastException bekommen.

public interface DelegatedFunction<T> { 

T call(Object... args); 

} 

public class DoesSomeDelegatedTask { 

    private List<DelegatedFunction<String>> delegatedFunctions = new ArrayList<>(1); 

    public void addFunction(DelegatedFunction<String> function) { 
    delegatedFunctions.add(function); 
    } 

    public void execute() { 
    for (DelegatedFunction<String> function: delegatedFunctions) { 
     System.out.println(function(something, someotherthing, whatever)); 
    } 
    } 
} 

public class Main { 
    public static void main(String[] args) throws Exception { 
    DoesSomeDelegateTask doer = new DoesSomeDelegatedTask(); 
    doer.addFunction(new DelegatedFunction<String>() { 
     @Override 
     public String call(Object... args) { 
     return ((SomeThings) args[0]).whatever((SomeOtherThing) args[1]//you get the idea 
     } 
    } 
    doer.execute(); 
    } 
}