Io-8-lab-wiki: Różnice pomiędzy wersjami
Nie podano opisu zmian |
|||
Linia 17: | Linia 17: | ||
W programie obiektem aktywnym jest Magazyn. Jest on obiektem obserwowanym przez wszystkich Producentów i wszystkich Konsumentów, stanowiących dwie grupy jego obserwatorów. | W programie obiektem aktywnym jest Magazyn. Jest on obiektem obserwowanym przez wszystkich Producentów i wszystkich Konsumentów, stanowiących dwie grupy jego obserwatorów. | ||
Magazyn w momencie gdy | Magazyn w momencie gdy posiada miejsce do wstawienia nowych elementów, powiadamia o tym wszystkich obserwujących go Producentów. W odpowiedzi każdy z nich, po upewnieniu się, że faktycznie może wstawić nowy element, produkuje go i wstawia do Magazynu. | ||
'''public void''' powiadomProducentów() { | |||
'''for''' (Producent prod : producenci) { | |||
prod.aktualizuj('''this'''); | |||
} | |||
} | |||
W momencie gdy Magazyn przechowuje jakiekolwiek elementy, powiadamia o tym wszystkich obserwujących go Konsumentów. W odpowiedzi każdy z nich, po upewnieniu się, że faktycznie może odebrać element, usuwa go z Magazynu i wyświetla jego wartość na ekranie. | W momencie gdy Magazyn przechowuje jakiekolwiek elementy, powiadamia o tym wszystkich obserwujących go Konsumentów. W odpowiedzi każdy z nich, po upewnieniu się, że faktycznie może odebrać element, usuwa go z Magazynu i wyświetla jego wartość na ekranie. | ||
''' | '''public void''' powiadomKonsumentów() { | ||
'''for''' (Konsument kons : konsumenci) { | |||
kons.aktualizuj('''this'''); | |||
} | |||
} | } | ||
Zatem obiekty Producent i Konsument definiują jedynie metody produkujące i konsumujące, natomiast głównym wątkiem jest powtarzająca się w pętli sekwencja powiadomień wysyłanych do Producentów i Konsumentów przez obiekt Magazyn. | Zatem obiekty Producent i Konsument definiują jedynie metody produkujące i konsumujące, natomiast głównym wątkiem jest powtarzająca się w pętli sekwencja powiadomień wysyłanych do Producentów i Konsumentów przez obiekt Magazyn. | ||
'''while''' ('''true''') { | |||
powiadomProducentów(); | |||
powiadomKonsumentów(); | |||
} | |||
Podczas uruchomienia programu do Magazynu (o określonej z góry pojemności) dołączane są jako jego obserwatory obiekty Producentów i Kosumentów. Następnie wykonywana jest opisana powyżej pętla. | Podczas uruchomienia programu do Magazynu (o określonej z góry pojemności) dołączane są jako jego obserwatory obiekty Producentów i Kosumentów. Następnie wykonywana jest opisana powyżej pętla. | ||
Wersja z 10:56, 1 wrz 2006
Ćwiczenie 8. Projektowanie i wzorce projektowe
Informacje wstępne
Ćwiczenie stanowi ilustrację do wykładu nt. wzorców projektowych. Przed przystąpieniem do realizacji ćwiczenia należy zapozanać się z wykładem oraz rozdziałem poświęconym wzorcowi Observer w książce Shallowaya i Trotta. Celem ćwiczenia jest zaimplementowanie wzorca Observer w prostym systemie obsługi.
Zadanie
Napisz program stanowiący implementację systemu producentów i konsumentów z wykorzystaniem wzorca Observer.
W programie występują trzy rodzaje obiektów:
- Producenci, będący instancjami klasy Producent. Wstawiają oni do obiektu Magazyn wyprodukowane przez siebie produkty (kolejne liczby naturalne).
- obiekt Magazyn, który istnieje dokładnie w jednej kopii
- Konsumenci, będący instancjami klasy Konsument. Usuwają oni z obiektu Magazyn wstawione tam przez Producentów liczby oraz wyświetlają ich wartości na ekranie.
W programie obiektem aktywnym jest Magazyn. Jest on obiektem obserwowanym przez wszystkich Producentów i wszystkich Konsumentów, stanowiących dwie grupy jego obserwatorów. Magazyn w momencie gdy posiada miejsce do wstawienia nowych elementów, powiadamia o tym wszystkich obserwujących go Producentów. W odpowiedzi każdy z nich, po upewnieniu się, że faktycznie może wstawić nowy element, produkuje go i wstawia do Magazynu.
public void powiadomProducentów() { for (Producent prod : producenci) { prod.aktualizuj(this); } }
W momencie gdy Magazyn przechowuje jakiekolwiek elementy, powiadamia o tym wszystkich obserwujących go Konsumentów. W odpowiedzi każdy z nich, po upewnieniu się, że faktycznie może odebrać element, usuwa go z Magazynu i wyświetla jego wartość na ekranie.
public void powiadomKonsumentów() { for (Konsument kons : konsumenci) { kons.aktualizuj(this); } }
Zatem obiekty Producent i Konsument definiują jedynie metody produkujące i konsumujące, natomiast głównym wątkiem jest powtarzająca się w pętli sekwencja powiadomień wysyłanych do Producentów i Konsumentów przez obiekt Magazyn.
while (true) { powiadomProducentów(); powiadomKonsumentów(); }
Podczas uruchomienia programu do Magazynu (o określonej z góry pojemności) dołączane są jako jego obserwatory obiekty Producentów i Kosumentów. Następnie wykonywana jest opisana powyżej pętla.
Pytania do dyskusji
- Jakie powiązania istnieją pomiędzy wszystkimi obiektami w tym systemie? Jaki jest wpływ Producentów i Konsumentów na siebie nawzajem?
- Czy Producent i Konsument mogą być instancjami tej samej klasy?
- Jakie możliwe zmiany w tym systemie mogą zostać wprowadzone (czyli jaki jest zakres jego zmienności) bez konieczności zmieniania struktury sterowania programu?
Literatura
- J. Cooper "Java. Wzorce projektowe". Helion, 2001
- A. Shalloway, J. R. Trott "Programowanie zorientowane obiektowo. Wzorce projektowe. Wydanie II". Helion, 2005.