Io-8-lab-wiki: Różnice pomiędzy wersjami

Z Studia Informatyczne
Przejdź do nawigacjiPrzejdź do wyszukiwania
Bwalter (dyskusja | edycje)
Bwalter (dyskusja | edycje)
 
(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.
Celem ćwiczenia jest zaimplementowanie wzorca Observer w prostym systemie obsługi.


==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''.
* obiekt Magazyn, który istnieje dokładnie w jednej kopii
* '''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:zpo-8-prodcons.png]]
{{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 jest 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.
 
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.
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.


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.
'''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 możliwe zmiany w tym systemie mogą zostać wprowadzone (czyli jaki jest zakres jego zmienności) bez konieczności zmieniania struktury sterowania programu?
# 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

  1. utworzeniu obiektu Magazynu o określonej pojemności
  2. utworzeniu i dołączeniu do Magazynu obiektów Producentów i Konsumentów jako jego obserwatorów
  3. 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

  1. 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?
  2. Jakie zmiany należałoby wprowadzić, aby umożliwić obsługę wielu Magazynów?
  3. Jakie powiązania istnieją pomiędzy wszystkimi obiektami w tym systemie? Jaki jest wpływ Producentów i Konsumentów na siebie nawzajem?

Literatura

  1. J. Cooper "Java. Wzorce projektowe". Helion, 2001
  2. A. Shalloway, J. R. Trott "Programowanie zorientowane obiektowo. Wzorce projektowe. Wydanie II". Helion, 2005.