O6x10

Delegacyjny model obsługi zdarzeń

Interakcja użytkownika z GUI polega na wywoływaniu zdarzeń (np. kliknięcie w przycisk, wciśnięcie klawisza na klawiaturze etc) - programowanie GUI jest programowaniem zdarzeniowym. Jest ono oparte na koncepcji tzw. funkcji callback. Funkcja typu callback zawarta w naszym programie jest wywoływana (zazwyczaj) nie przez nasz program, ale przez sam system na przykład w reakcji na zdarzenia takie jak wciśnięcie klawisza czy kliknięcie myszką. Funkcja ta obsługuje zdarzenie.

W Javie dodatkowo zastosowano koncepcję delegacyjnego modelu obsługi zdarzeń, która umożliwia przekazanie obsługi zdarzenia, które przytrafia się jakiemuś obiektowi (Źródło zdarzenia) do innego obiektu (Słuchacza zdarzenia).
Zdarzenia są obiektami odpowiednich klas, określających rodzaj zdarzeń.
Słuchacze są obiektami klas implementujących interfejsy nasłuchu. Interfejsy nasłuchu określają zestaw metod obsługi danego rodzaju zdarzeń.
W klasach słuchaczy definiuje się metody odpowiedniego interfejsu nasłuchu zdarzeń, które określają co ma się dziać w wyniku zajścia określonego zdarzenia (metody obsługi odpowiednich zdarzeń)
Zdarzenie (obiekt odpowiedniej klasy zdarzeniowej) jest przekazywane do obsługi obiektowi-słuchaczowi tylko wtedy gdy Słuchacz ten jest przyłączony do Źródła zdarzenia. (przyłączenie za pomocą odwołania z.addNNNListener(h), gdzie: z – Źródło zdarzenia, NNN - rodzaj zdarzenia, h – Słuchacz danego rodzaju zdarzenia)
Przekazanie zdarzenia do obsługi polega na wywołaniu odpowiedniej dla danego zdarzenia metody obsługi zdarzenia (zdefiniowanej w klasie Słuchacza) z argumentem obiekt-zdarzenie.
Argument (obiekt klasy zdarzeniowej) zawiera informacje o okolicznościach zajścia zdarzenia (np. komu się przytrafiło? kiedy? jakie ma inne właściwości?). Jako parametr w metodzie obsługi może być odpytany o te informacje.

klasy anonimowe

Klasę anonimową (tzn. bez jawnego użycia słowa class, bez jawnego zadeklarowania, że dziedziczymy po klasie bazowej Object)
Klasa anonimowa jest to klasa bez nazwy i konstruktora, definiowana za pomocą wyrażenia postaci:

new NazwaNadKlasy (arg, arg, …) { Blok }

gdzie: NazwaNadKlasy jest nazwą nadklasy definiowanej klasy anonimowej, arg są argumentami konstruktora nadklasy (zależnie od podanych argumentów wołany jest odpowiedni konstruktor nadklasy: super NazwaNadKlasy (arg, arg, …)), Blok jest blokiem instrukcji definiujących klasę anonimową.

W przypadku, gdy jesteśmy zainteresowani obsługą przez komponent tylko jednej rodziny zdarzeń, możemy użyć klasy anonimowej

klasy wewnętrzne

Klasę wewnętrzną tworzymy umieszczając jej definicję wewnątrz innej klasy. Nazwa klasy wewnętrznej jest znana w obrębie klasy zewnętrznej. Poza tą klasą musimy użyć konstrukcji NazwaKlasyZewnętrznej.NazwaKlasyWewnętrznej.
Klasy wewnętrzne przydają się w specyficznych sytuacjach. Jednym z ważniejszych powodów stosowania klas wewnętrznych jest fakt, że każda może dziedziczyć niezależnie od innych klas wewnętrznych, jak i od klasy zewnętrznej, zachowując jednocześnie dostęp do składników klasy zewnętrznej (także prywatnych!).

Jest do dobry sposób na ominięcie zakazu dziedziczenia po dwóch klasach.
Wynika z tego także, że każda klasa wewnętrzna może na swój sposób dziedziczyć z tej samej klasy bądź implementować ten sam interfejs, co jest szczególnie przydatne w obsłudze zdarzeń.

adaptery

Adaptery są Fasadami (opakowują dostęp do podsystemu lub systemu w pojedynczym obiekcie)

+Aplikacje wielowątkowe.
Wielowątkowość to cecha, dzięki której w ramach jednego procesu może wykonywać kilka wątków lub jednostek wykonawczych. Nowe wątki to kolejne ciągi instrukcji wykonywane oddzielnie. Wszystkie wątki tego samego procesu współdzielą kod programu i dane.

O ile nie zaznaczono inaczej, treść tej strony objęta jest licencją Creative Commons Attribution-ShareAlike 3.0 License