2013-02-22 10 views
5

Przyjrzałem się przykładowi, w którym wyjaśniono wzorzec delegowania dla java. Nie znalazłem zbyt dużego pożytku (usprawiedliwiam ignorancję), ponieważ uważam, że brakuje mu elastyczności w celu-c. Czy istnieje sposób na dynamiczne ustawienie obiektu delegata, jak można zrobić w celu-c. Czy nie jest to cały sens delegacji? Moja znajomość języka Java jest bardzo wstępna, więc proszę wyjaśnić nieco szczegółowo.Jak zaimplementować wzorzec delegatów (jak w przypadku c-c) w java

+0

Sieć [Java AWT architektura Event] (http://docs.oracle.com/javase/1.4.2/docs/guide/awt/1.3/designspec/events.html) wykorzystuje model delegacji. Możesz dać połączonemu dokumentowi odczyt. – Perception

+0

@Perception: sprawdziłem link. W podanym przykładzie kodu nie jest konieczne, aby przekazany uczestnik zawsze był typu "App". To właśnie miałem na myśli przez elastyczność. Czy nie mam racji co do tego, że obiekt aplikacji jest delegatem? – Rakesh

+0

Kilka dni temu tutaj http://stackoverflow.com/questions/14963740/cast-to-implemented-class/14963939#14963939 Naszkicowałem wzór delegacji z przykładem, możesz to sprawdzić. – gaborsch

Odpowiedz

8

Sądzę, że istnieje wiele sposobów na wdrożenie schematu delegowania w Javie, ale prawdopodobnie żaden z nich nie wygląda jak wbudowany.

Spójrz na Wikipedia example. Podstawową opcją jest ręczne wprowadzenie interfejsu za pomocą interfejsu, a następnie po prostu przekazywanie wywołań do konkretnej instancji, którą można zmienić w trakcie wykonywania tak długo, jak chcesz.

Teraz, w zależności od posiadanych narzędzi i możliwości ich wykorzystania, można wykonać automatyczne przekierowanie podając. Jednym z pomysłów jest użycie programowania zorientowanego aspektowo, takiego jak AspectJ.

Posiadanie kompilator aspekt (lub Runtime) można wykorzystać adnotacje i wymyślić proste rozszerzenie języka:

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

Byłbyś wtedy napisać aspekt, który znajdzie @Delegate S i automatycznie dodaje metody przekazywania w interfejsie klasy (np. Person).

Jeśli jesteś w stanie wykorzystać a more groovy JVM language, to nawet nie trzeba pisać pojedynczego wiersza kodu, ponieważ takie języki mają delegatów w bibliotece standardowej:

Można spojrzeć here, aby zobaczyć, jak to się robi w Groovy. (istotnie dokładnie tak, jak w przypadku przykładowej składni Person wymyśliłem ... ale wbudowane!)

2

Oto jak udajesz funkcjonalny idiom w Javie. Tak, to jest ohydne. Jeśli chcesz mieć eleganckie idiomy funkcjonalne, użyj języka, który nie traktuje funkcji takich jak step-dzieci z czerwonymi głowami. Jeśli chcesz więcej czasu na kompilację, możesz oczywiście użyć bardziej szczegółowych definicji interfejsu, aby uniknąć błędów indeksowania IndexOutOfBounds i ClassCastException.

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(); 
    } 
}