Io-8-lab-wiki: Różnice pomiędzy wersjami
(Nie pokazano 15 pośrednich wersji utworzonych przez tego samego użytkownika) | |||
Linia 2: | Linia 2: | ||
==Informacje wstępne== | ==Informacje wstępne== | ||
Ćwiczenie stanowi ilustrację do wykładu nt. wzorców projektowych. | Ćwiczenie stanowi ilustrację do wykładu nt. wzorców projektowych. Celem ćwiczenia jest zaimplementowanie wzorca Observer w znanym problemie producent-konsument. | ||
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. | 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. | ||
==Zadanie== | Sugerowanym środowiskiem programowania jest Eclipse. | ||
==Zadanie 1== | |||
Napisz program stanowiący implementację systemu producentów i konsumentów z wykorzystaniem wzorca Observer. | Napisz program stanowiący implementację systemu producentów i konsumentów z wykorzystaniem wzorca Observer. | ||
W programie występują trzy rodzaje obiektów: | 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 | * '''Producenci''', będący instancjami klasy ''Producent''. Wstawiają oni do obiektu ''Magazyn'' wyprodukowane przez siebie produkty (kolejne liczby naturalne; licznik jest zmienną statyczną w klasie ''Producent''. | ||
* | * '''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. | * '''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. | ||
[[image: | {{kotwica|io-8-prodcons|Schemat powiązań między obiektami}} | ||
[[image:io-8-prodcons.png]] | |||
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. | |||
Magazyn, powiadamiając swoich obserwatorów, przekazuje im referencję ''this'', dzięki czemu mogą one sprawdzić, czy faktycznie jest miejsce w Magazynie. | |||
'''public void''' powiadomProducentów() { | |||
'''for''' (Producent prod : producenci) { | |||
prod.produkuj('''this'''); | |||
} | |||
} | |||
Gdy w Magazynie znajdują się jakiekolwiek elementy, powiadamia on 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.konsumuj('''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''') { | |||
'''if''' (magazyn.maMiejsce()) | |||
powiadomProducentów(); | |||
'''if''' (magazyn.saElementy()) | |||
powiadomKonsumentów(); | |||
sleep(100); | |||
} | |||
Uruchomienie programu (w metodzie ''main()'') polega na | |||
# utworzeniu obiektu Magazynu o określonej pojemności | |||
# utworzeniu i dołączeniu do Magazynu obiektów Producentów i Konsumentów jako jego obserwatorów | |||
# wykonywanie opisanej powyżej pętli | |||
==Zadanie 2== | |||
Zmień program tak, aby korzystał z istniejących w JDK interfejsów ''java.util.Observer'' oraz ''java.util.Observable'' | |||
==Przykładowe rozwiązanie== | |||
Przykładowe rozwiązanie ćwiczenia w postaci zarchiwizowanego projektu Eclipse można znaleźć [[media:io-08-lab.zip|tutaj]] | |||
==Pytania do dyskusji== | ==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 | # W opisanym systemie Producenci i Konsumenci są instancjami różnych klas. Czy istnieje możliwość stworzenia klasy, która mogłaby występować w obu tych rolach? Jeżeli tak, to jakich zmian wymagałoby to rozwiązanie? | ||
# Jakie zmiany należałoby wprowadzić, aby umożliwić obsługę wielu Magazynów? | |||
# Jakie powiązania istnieją pomiędzy wszystkimi obiektami w tym systemie? Jaki jest wpływ Producentów i Konsumentów na siebie nawzajem? | |||
==Literatura== | ==Literatura== | ||
# J. Cooper "Java. Wzorce projektowe". Helion, 2001 | # J. Cooper "Java. Wzorce projektowe". Helion, 2001 | ||
# A. Shalloway, J. R. Trott "Programowanie zorientowane obiektowo. Wzorce projektowe. Wydanie II". Helion, 2005. | # A. Shalloway, J. R. Trott "Programowanie zorientowane obiektowo. Wzorce projektowe. Wydanie II". Helion, 2005. |
Aktualna wersja na dzień 23:56, 4 wrz 2006
Ćwiczenie 8. Projektowanie i wzorce projektowe
Informacje wstępne
Ćwiczenie stanowi ilustrację do wykładu nt. wzorców projektowych. Celem ćwiczenia jest zaimplementowanie wzorca Observer w znanym problemie producent-konsument.
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.
Sugerowanym środowiskiem programowania jest Eclipse.
Zadanie 1
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; licznik jest zmienną statyczną w klasie Producent.
- 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.
Schemat powiązań między obiektami
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.
Magazyn, powiadamiając swoich obserwatorów, przekazuje im referencję this, dzięki czemu mogą one sprawdzić, czy faktycznie jest miejsce w Magazynie.
public void powiadomProducentów() { for (Producent prod : producenci) { prod.produkuj(this); } }
Gdy w Magazynie znajdują się jakiekolwiek elementy, powiadamia on 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.konsumuj(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) { if (magazyn.maMiejsce()) powiadomProducentów(); if (magazyn.saElementy()) powiadomKonsumentów(); sleep(100); }
Uruchomienie programu (w metodzie main()) polega na
- utworzeniu obiektu Magazynu o określonej pojemności
- utworzeniu i dołączeniu do Magazynu obiektów Producentów i Konsumentów jako jego obserwatorów
- wykonywanie opisanej powyżej pętli
Zadanie 2
Zmień program tak, aby korzystał z istniejących w JDK interfejsów java.util.Observer oraz java.util.Observable
Przykładowe rozwiązanie
Przykładowe rozwiązanie ćwiczenia w postaci zarchiwizowanego projektu Eclipse można znaleźć tutaj
Pytania do dyskusji
- W opisanym systemie Producenci i Konsumenci są instancjami różnych klas. Czy istnieje możliwość stworzenia klasy, która mogłaby występować w obu tych rolach? Jeżeli tak, to jakich zmian wymagałoby to rozwiązanie?
- Jakie zmiany należałoby wprowadzić, aby umożliwić obsługę wielu Magazynów?
- Jakie powiązania istnieją pomiędzy wszystkimi obiektami w tym systemie? Jaki jest wpływ Producentów i Konsumentów na siebie nawzajem?
Literatura
- J. Cooper "Java. Wzorce projektowe". Helion, 2001
- A. Shalloway, J. R. Trott "Programowanie zorientowane obiektowo. Wzorce projektowe. Wydanie II". Helion, 2005.