Cyfroteka.pl

klikaj i czytaj online

Cyfro
Czytomierz
00504 014703 9155186 na godz. na dobę w sumie
Wzorce projektowe. Rusz głową! - książka
Wzorce projektowe. Rusz głową! - książka
Autor: , , , Liczba stron: 656
Wydawca: Helion Język publikacji: polski
ISBN: 978-83-246-2803-2 Data wydania:
Lektor:
Kategoria: ebooki >> komputery i informatyka >> programowanie >> techniki programowania
Porównaj ceny (książka, ebook (-20%), audiobook).

Otwórz swój umysł. Poznaj wszystko, co związane z wzorcami projektowymi, w sposób gwarantujący szybkie i skuteczne opanowanie zasad ich stosowania. Zapomnij o listingach liczących tysiące wierszy, długich i nużących opisach teoretycznych oraz rozbudowanych schematach zależności. Wzorce projektowe to gotowe opisy rozwiązań najczęstszych problemów napotykanych przy tworzeniu oprogramowania. Aby je prawidłowo stosować, należy poznać założenia, na podstawie których zostały stworzone, oraz nauczyć się implementować je we właściwy sposób.

Naprzód, głowo!

Nikt ci tego nie potrafił wytłumaczyć? Wydaje Ci się, że to problem nie na Twoją głowę? Nie potrzebujesz elektrowstrząsów, żeby pobudzić swój mózg do aktywnego działania. Tylko żadnych gwałtownych gestów! Usiądź wygodnie, otwórz książkę, dopiero teraz się zacznie. Na początek - rusz głową!

Precz z nudnymi wykładami i zakuwaniem bez zrozumienia!

Nauka to znacznie więcej niż tylko czytanie suchego tekstu. Twój mózg jest niczym głodny rekin, cały czas prący naprzód w poszukiwaniu nowej, apetycznej przekąski. Jak karmimy Twój wygłodniały umysł?

Używamy rysunków, bo obraz wart jest 1024 słów. Stosujemy powtórzenia, by zakodować na stałe dane w Twojej chłonnej głowie. Oddziałujemy na emocje, jesteśmy nieprzewidywalni, zaskakujący i zabawni. Stawiamy przed Tobą wyzwania i zadajemy pytania, które angażują Cię w proces studiowania przedstawianych zagadnień. Cały czas pobudzamy Twój umysł do aktywnego działania, zmuszamy go do posłuszeństwa... a za ciężką pracę nagrodzimy go smakowitym ciasteczkiem w postaci wiedzy - wisienka gratis!

Rozkmiń to sam!

Przekonaj się, że nowoczesne metody nauczania
mogą zmienić również sposób poznawania nowoczesnych technik programistycznych.

Znajdź podobne książki Ostatnio czytane w tej kategorii

Darmowy fragment publikacji:

Idź do • Spis treści • Przykładowy rozdział Katalog książek • Katalog online • Zamów drukowany katalog Twój koszyk • Dodaj do koszyka Cennik i informacje • Zamów informacje o nowościach • Zamów cennik Czytelnia • Fragmenty książek online Kontakt Helion SA ul. Kościuszki 1c 44-100 Gliwice tel. 32 230 98 63 e-mail: helion@helion.pl © Helion 1991–2010 Wzorce projektowe. Rusz g³ow¹! Autorzy: Elisabeth Freeman, Eric Freeman, Bert Bates, Kathy Sierra T³umaczenie: Adam Balcerzak, Marcin Jêdrysiak, Tomasz Wasilewski ISBN: 978-83-246-2803-2 Tytu³ orygina³u: Head First Design Patterns Format: 200×230, stron: 656 Otwórz swój umys³. Poznaj wszystko, co zwi¹zane z wzorcami projektowymi, w sposób gwarantuj¹cy szybkie i skuteczne opanowanie zasad ich stosowania. Zapomnij o listingach licz¹cych tysi¹ce wierszy, d³ugich i nu¿¹cych opisach teoretycznych oraz rozbudowanych schematach zale¿noœci. Wzorce projektowe to gotowe opisy rozwi¹zañ najczêstszych problemów napotykanych przy tworzeniu oprogramowania. Aby je prawid³owo stosowaæ, nale¿y poznaæ za³o¿enia, na podstawie których zosta³y stworzone, oraz nauczyæ siê implementowaæ je we w³aœciwy sposób. Naprzód, g³owo! Nikt ci tego nie potrafi³ wyt³umaczyæ? Wydaje Ci siê, ¿e to problem nie na Twoj¹ g³owê? Nie potrzebujesz elektrowstrz¹sów, ¿eby pobudziæ swój mózg do aktywnego dzia³ania. Tylko ¿adnych gwa³townych gestów! Usi¹dŸ wygodnie, otwórz ksi¹¿kê, dopiero teraz siê zacznie. Na pocz¹tek – rusz g³ow¹! Precz z nudnymi wyk³adami i zakuwaniem bez zrozumienia! Nauka to znacznie wiêcej ni¿ tylko czytanie suchego tekstu. Twój mózg jest niczym g³odny rekin, ca³y czas pr¹cy naprzód w poszukiwaniu nowej, apetycznej przek¹ski. Jak karmimy Twój wyg³odnia³y umys³? U¿ywamy rysunków, bo obraz wart jest 1024 s³ów. Stosujemy powtórzenia, by zakodowaæ na sta³e dane w Twojej ch³onnej g³owie. Oddzia³ujemy na emocje, jesteœmy nieprzewidywalni, zaskakuj¹cy i zabawni. Stawiamy przed Tob¹ wyzwania i zadajemy pytania, które anga¿uj¹ Ciê w proces studiowania przedstawianych zagadnieñ. Ca³y czas pobudzamy Twój umys³ do aktywnego dzia³ania, zmuszamy go do pos³uszeñstwa… a za ciê¿k¹ pracê nagrodzimy go smakowitym ciasteczkiem w postaci wiedzy – wisienka gratis! Rozkmiñ to sam! (cid:129) Cele stosowania wzorców projektowych (cid:129) Za³o¿enia, na których opieraj¹ siê wzorce projektowe (cid:129) Najwa¿niejsze i najczêœciej wykorzystywane wzorce projektowe (cid:129) Przechowywanie i prezentacja danych (cid:129) Mechanizm RMI (cid:129) Wzorzec MVC (cid:129) Implementacja wzorców projektowych w aplikacjach Przekonaj siê, ¿e nowoczesne metody nauczania mog¹ zmieniæ równie¿ sposób poznawania nowoczesnych technik programistycznych Spis treści (skrócony) Wprowadzenie 1. Witamy w krainie wzorców projektowych: wprowadzenie 2. Jak sprawić, by Twoje obiekty były zawsze dobrze poinformowane: Wzorzec Obserwator 3. Dekorowanie zachowania obiektów: Wzorzec Dekorator 4. Pizzeria zorientowana obiektowo: Wzorzec Fabryka 5. Obiekty jedyne w swoim rodzaju: Wzorzec Singleton 6. Hermetyzacja wywołań: Wzorzec Polecenie 7. Zdolność do adaptacji: Wzorce Adapter oraz Fasada 8. Hermetyzacja algorytmów: Wzorzec Metoda Szablonowa 9. Zarządzanie kolekcjami: Wzorce Iterator i Kompozyt 10. Stan obiektu: Wzorzec Stan 11. Kontrola dostępu do obiektu: Wzorzec Proxy 12. Łączenie wzorców: Wzorce złożone 13. Wzorce projektowe w praktyce: Nowe życie z wzorcami 14. Dodatek: inne wzorce Skorowidz 21 33 67 109 139 197 217 259 297 335 403 447 517 595 629 649 Spis treści (na serio) Wprowadzenie Twój mózg jest skoncentrowany na wzorcach projektowych. W tym rozdziale Ty starasz się czegoś dowiedzieć, a Twój mózg robi Ci przysługę i nie przykłada się do zapamiętywania zdobywanej wiedzy. Twój mózg myśli sobie: „Lepiej zostawię miejsce w pamięci na bardziej istotne informacje, na przykład: jakich dzikich zwierząt należy unikać bądź czy jeżdżenie nago na snowboardzie jest dobrym pomysłem”. A zatem, w jaki sposób możesz przekonać swój mózg, że Twoje życie zależy od poznania wzorców projektowych? Dla kogo przeznaczona jest ta książka? Wiemy także, co sobie myśli Twój mózg Metapoznanie Zmuś swój mózg do posłuszeństwa Zespół recenzentów technicznych Podziękowania 22 23 25 27 30 31 2005-06-29 10:10:32 2005-06-29 10:10:32 6 ! spis_tresci_00.indd 6 ! spis_tresci_00.indd 6 Wprowadzenie do wzorców projektowych 1 Witamy w krainie wzorców projektowych Ktoś rozwiązał już Twoje problemy. W tym rozdziale dowiesz się, dlaczego (i w jaki sposób) możesz wykorzystać wiedzę i doświadczenia zdobyte przez innych projektantów i programistów, którzy podczas pracy nad różnymi projektami zmuszeni byli wstąpić na pełną zdradliwych pułapek ścieżkę i — co najważniejsze — udało im się przeżyć taką wyprawę. Zanim dobrniemy do końca rozdziału, rzucimy okiem na sposoby wykorzystywania wzorców projektowych i przedstawimy ich zalety, poznamy kilka podstawowych zasad projektowania zorientowanego obiektowo, a także omówimy sposób działania przykładowego wzorca. Najlepszą metodą zastosowania wzorca jest załadowanie go bezpośrednio do Twojego mózgu, a następnie zlokalizowanie obszarów w obrębie projektowanych rozwiązań oraz istniejących aplikacji, w których możesz je zastosować. Pracując z wzorcami projektowymi, zamiast wielokrotnego wykorzystywania tych samych fragmentów kodu, wielokrotnie wykorzystujesz swoje doświadczenia. Pamiętaj, opanowanie takich zagadnień, jak abstrakcyjność, dziedziczenie i polimorfizm, nie zrobi jeszcze z Ciebie dobrego projektanta systemów zorientowanych obiektowo. Prawdziwy guru zawsze myśli o stworzeniu elastycznego projektu, który będzie łatwy do serwisowania i będzie sobie w stanie poradzić ze zmieniającymi się warunkami. Prosta aplikacja o nazwie SymulatorKaczki Jacek rozmyśla o dziedziczeniu… A może by tak interfejs? Jedyny pewny element w procesie tworzenia oprogramowania Oddzielanie tego, co się zmienia, od tego, co pozostaje niezmienione Projektowanie zachowania Kaczki Testowanie kodu klasy Kaczka Dynamiczne ustawianie zachowania Wielki diagram „ukrytych” zachowań Relacja MA może być lepsza niż JEST Rozmawiając o wzorcach projektowania Potęga wspólnego słownika wzorców W jaki sposób mogę wykorzystywać wzorce projektowe? Twoja skrzynka narzędziowa Rozwiązania ćwiczeń 34 37 38 40 42 43 50 52 54 55 56 60 61 64 66 E n c a p s u l a t e d fl y b e h a v i o r i n t e r f a c e F l y B e h a v i o r fl y ( ) T w ó j M Ó Z G i e n t C l D u c k F l y B e h a v i o r fl y B e h a v i o r ; Q u a c k B e h a v i o r q u a c k B e h a v - s w i m ( ) d i s p l a y ( ) p e r f o r m Q u a c k ( ) p e r f o r m F l y ( ) s e t F l y B e h a v i o r ( ) s e t Q u a c k B e h a v i o r ( ) O T H E R d u c k - l / / i k e m e t h - D e c o y D u c k d i s p l a y ( ) { l l o o k s / / i k e a d e c o y D u c k r u b b e r d u c k } R u b b e r ) d i s p l a y ( l o o k s / / { i k e a l } R e d h e a d D u c k ) d i s p l a y ( r e d h e a d l o o k s / / { i k e a l l a r d D u c k M a l { ) d i s p l a y ( i k e a m a l l o o k s / / Object that holds state l a r d l } t h W i n g s F l y W i fl y ( ) { i m p l e m e n t s d u c k / / fl y i n g F l y N o W a y d o n o t h i n g - c a n ’ fl y ( ) { / } / fl y ! t E n c a p s u l a t e d q u a c k b e h a v i o r i n t e r f a c e Q u a c k B e h a v i o r q u a c k ( ) M u t e Q u a c k q u a c k ( ) { d o n o t h i n g - c a n ’ / / q u a c k ! t S q u e a k q u a c k ( ) { r u b b e r d u c k i e / / s q u e a k Q u a c k q u a c k ) { i m p l e m e n t s d u c k / / q u a c k i n g OBSERWATOR h c y w o t k e j o r p w ó c r o z w a p u r G 8 int Subject O bj e ct 8 8 8 8 Dog O bject Duck O bject Cat Obj e ct Automatic update/notification Mouse O bject C o n t Observers r o l l e r V i e w ! spis_tresci_00.indd 7 ! spis_tresci_00.indd 7 t n e d n e bje p e D O s t c R e q u e s t M V C e l d M o j u ż c a ł k i e m t e r a z K o d, w z b o g a c o n y p o p r z e z i Tw ó j n o w y z a s t o s o w a n i e w z o r c ó w p r o j e k t o w y c h . 7 2005-06-29 10:10:32 2005-06-29 10:10:32 Wzorzec Obserwator 2 Jak sprawić, by Twoje obiekty były zawsze dobrze poinformowane Nie przegap okazji, kiedy dzieje się coś naprawdę ciekawego! Przedstawimy Ci wzorzec, który potrafi poinformować inne obiekty o tym, że wydarzyło się coś, czym powinny się zająć. Co ciekawe, obiekty mogą nawet samodzielnie decydować w czasie działania programu o tym, czy chcą być informowane o takich wydarzeniach. Wzorzec Obserwator jest jednym z najczęściej wykorzystywanych wzorców w pakiecie JDK (ang. Java Development Kit), a co najważniejsze — jest wręcz niewiarygodnie użyteczny. W niniejszym rozdziale rzucimy również okiem na relacje typu jeden-do-wielu oraz tzw. luźne związki (tak, to prawda, napisaliśmy „luźne związki”). Korzystając z wzorca Obserwator, z pewnością odmienisz swoje życie. P o d s t a w y p r o g r a m o w a n i a o b i e k t o w e g o A b s t r a k c y j n o ś ć H e r m e t y z a c j a i z m i m o r f Po l D z i e d z i c z e n i e i l e t o s i e b i e w z a j e m n i e . R e g u ł y p r o g r a m o w a n i a o b i e k t o w e g o s i ę z m i e n i a . t o, c o h e r m e t y z a c j Po d d a w a j k o m p o z y c j ę n a d d z i e d z i c z e n i e . P r z e d k ł a d a j s ó w, i n t e r f e j s i ę n a t w o r z e n i u S k o n c e n t r u j i m p l e m e n t a c j a n i e s i ę t w o r z y ć p r o j e k t y, w k t ó r y c h i, o l u ź n o p o w i ą z a n e S t a r a j s ą z e o b i e k t y i w e, n i e o d d z i a ł u j ą n a m o ż l s o b ą . i i Aplikacja sprawdzająca warunki pogodowe Spotkanie z wzorcem Obserwator Wydawca + Prenumerator = wzorzec Obserwator Pięciominutowe przedstawienie — obserwowany kontra obserwujący Definicja wzorca Obserwator Siła luźnych zależności Projektowanie stacji meteorologicznej Implementacja stacji meteorologicznej Java — zastosowanie wbudowanego wzorca Obserwator Ciemna strona klasy java.util.Observable Twoja skrzynka narzędziowa Rozwiązania ćwiczeń 69 74 75 78 81 83 86 87 94 101 104 107 Obiekt, którego stan jest obserwowany RELACJA JEDEN-DO-WIELU 8 int Obiekt obs e w r o wany 8 8 8 8 Obiekt Pies Obiekt K a czka Obiekt K o t Automatyczna aktualizacja (powiadamianie) Obiekt Mysz Obiekty obserwujące (Observers) e n ż e l a z y t k e i b O 8 ! spis_tresci_00.indd 8 ! spis_tresci_00.indd 8 2005-06-29 10:10:35 2005-06-29 10:10:35 Wzorzec Dekorator 3 Dekorowanie zachowania obiektów W zasadzie niniejszy rozdział możemy równie dobrze zatytułować „Otwieranie oczu programistom z nadmiernymi skłonnościami do nadużywania dziedziczenia”. W tym rozdziale spróbujemy krytycznie przyjrzeć się zwyczajowym skłonnościom do nadużywania mechanizmu dziedziczenia oraz nauczymy Cię sposobów dekorowania zachowania klas w czasie działania programu przy użyciu pewnej formy kompozycji obiektów. Dlaczego? Po zapoznaniu się z technikami dekoracji zachowania klas będziesz mógł wyposażać swoje (i nie tylko) obiekty w nowe możliwości bez konieczności dokonywania jakichkolwiek modyfikacji w kodzie klas podstawowych. Witamy w „Star Café” Reguła otwarte-zamknięte Spotkanie z wzorcem Dekorator Konstruowanie zamówienia przy użyciu Dekoratorów Definicja wzorca Dekorator Dekorujemy nasze Napoje Tworzymy kod aplikacji „Star Café” Dekoratory w świecie rzeczywistym: obsługa wejścia-wyjścia w języku Java Tworzenie własnych dekoratorów obsługi wejścia-wyjścia Twoja skrzynka narzędziowa Rozwiązania ćwiczeń 110 116 118 119 121 122 125 130 132 135 136 Zawsze sądziłem, że prawdziwi mężczyźni tworzą podklasy dla wszystkiego, co się tylko do tego nadaje. Tak było do czasu, gdy dowiedziałem się o korzyściach, jakie daje możliwość rozszerzania możliwości aplikacji na poziomie działania, a nie kompilacji. A teraz — spójrzcie tylko na mnie! ! spis_tresci_00.indd 9 ! spis_tresci_00.indd 9 9 2005-06-29 10:10:35 2005-06-29 10:10:35 Wzorzec Fabryka 4 Pizzeria zorientowana obiektowo Przygotuj się do stworzenia kilku projektów, w których zastosujemy luźne powiązania pomiędzy poszczególnymi obiektami. Stworzenie nowego obiektu to dużo więcej niż tylko proste zastosowanie operatora new. Niebawem przekonasz się, że proces ten jest operacją, która nie zawsze powinna być publicznie dostępna, a co więcej, jest operacją, która często może prowadzić do poważnych problemów z powiązaniami międzyobiektowymi. A tego byś nie chciał, prawda? Przekonaj się, w jaki sposób wzorzec Factory może uratować Cię z takiej opresji. Klientami fabryki abstrakcyjnej są dwa obiekty naszej klasy Pizzeria, WłoskaPizzeria i Amerykańska Pizzeria. WłoskaPizzeria utwórzPizza() interfejs Ciasto GrubeChrupkieCiasto CienkieChrupkieCiasto interfejs Sos SosPomidorowy SosMarinara interfejs Ser SerMozzarella SerReggiano interfejs Małże MrożoneMałże ŚwieżeMałże Każda fabryka wytwarza różne implementacje tej samej rodziny produktów. Klasa abstrakcyjna FabrykaSkładnikówPizzy jest interfejsem, który określa, w jaki sposób powinna być tworzona rodzina spokrewnionych produktów — wszystkie składniki, które są niezbędne do zrobienia pizzy. interfejs FabrykaSkładnikówPizzy utwórzCiasto() utwórzSos() utwórzSer() utwórzWarzywa() utwórzPepperoni() utwórzMałże() WłoskaFabrykaSkładnikówPizzy AmerykańskaFabryka SkładnikówPizzy utwórzCiasto() utwórzSos() utwórzSer() utwórzWarzywa() utwórzPepperoni() utwórzMałże() utwórzCiasto() utwórzSos() utwórzSer() utwórzWarzywa() utwórzPepperoni() utwórzMałże() Zadaniem fabryk rzeczywistych jest wytwarzanie odpowiednich składników pizzy. Każda fabryka wie, w jaki sposób należy utworzyć składniki odpowiednie dla danego regionu. Kiedy widzisz „nowy” obiekt, myśl o nim jako o „konkretnym” Pizza w Obiektowie Hermetyzacja procesu tworzenia obiektów Budujemy prostą fabrykę pizzy Tworzymy definicję „wzorca” Simple Factory Nowa struktura Pizzerii Zezwalamy klasom podrzędnym na podejmowanie decyzji Tworzymy Pizzerię Deklarowanie metody typu Factory (fabryka) Spotkanie z wzorcem Metoda Fabrykująca Równoległa hierarchia klas Definicja wzorca Metoda Fabrykująca Pizzeria mocno uzależniona Sprawdzamy zależności pomiędzy obiektami Zastosowanie reguły DIP A w międzyczasie, na zapleczu Pizzerii… Rodziny składników… Budujemy fabryki składników pizzy Fabryka Abstrakcyjna Za kulisami Definicja wzorca Fabryka Abstrakcyjna Porównanie Metody Fabrykującej oraz Fabryki Abstrakcyjnej Twoja skrzynka narzędziowa Rozwiązania ćwiczeń 140 142 144 145 147 150 151 153 155 161 162 164 167 168 170 174 175 176 183 184 186 190 192 193 10 ! spis_tresci_00.indd 10 ! spis_tresci_00.indd 10 2005-06-29 10:10:36 2005-06-29 10:10:36 Wzorzec Singleton 5 Obiekty jedyne w swoim rodzaju Kolejnym przystankiem w naszej podróży jest wzorzec Singleton, czyli nasza przepustka do kreowania jedynych w swoim rodzaju obiektów, posiadających tylko jedną instancję. Być może ucieszysz się na wieść o tym, że Singleton jest najprostszym z istniejących wzorców projektowych (przynajmniej pod względem kategorii stopnia złożoności jego diagramu klas); jak by na to nie patrzeć, jego diagram składa się tylko z jednej klasy! Ale nie wpadaj w euforię; niezależnie od prostoty diagramu klas tego wzorca na drodze prowadzącej do jego implementacji napotkamy całkiem sporo wybojów i dziur. Lepiej zapnij mocno pasy — to nie będzie takie proste, jakby mogło się wydawać. Jeden i tylko jeden Mały Singleton Analiza klasycznej implementacji wzorca Singleton Wyznania obiektu Singleton Fabryka czekolady Definicja wzorca Singleton Ups, mamy problem… Zostań wirtualną maszyną Java Jak sobie radzić z wielowątkowością? Wzorzec Singleton — pytania i odpowiedzi Twoja skrzynka narzędziowa Rozwiązania ćwiczeń 198 199 201 202 203 205 206 207 208 212 214 216 Hershey, PA W z o r c e p r o g r a m o w a n i a o b i e k t o w e g o j e d e n - r e l a c j ę i n i u j e r o d z i n y a l g o r y t m ó w, d o k o n u j e i n i u j e p o m i ę d z y o b i e k t a m i D e k o r a t o r — p o z w a l a n a d y n a m i c z n e p r z y d z i e l a n i e s p o s ó b, ż e k i e d y w y b r a n y o b i e k t z m i e n i a s i ę o n e w y m i e n n e . O b s e r w a t o r — d e f S t r a t e g y — d e f s t a j ą D e k o r a t o r y d a j ą d o s p o w o d u j e, ż e i n t e r f e j j e g o o b i e k t y z a l e ż n e z o s t a j ą o t y m i k a c j ę d a n e g o Fa b r y k a A b s t r a k c y j n a — d o s t a r c z a p o z w a l a j ą c y n o w y c h z a c h o w a ń . l u b z a l e ż n y c h i c h h e r m e t y z a c j d o - w i e l u w t a k i W z o r z e c S t r a t e g y p o z w a l a n a m o d y f j a k ą d a j e d z i e d z i c z e n i e, s i e n t a, k t ó r y t e g o a l g o r y t m u i n t e r f e j s p o k r e w n i o n y c h d a n e m u o b i e k t o w i i z o w a n e . i n i u j e s t a n, w s z y s t k i e n a t w o r z e n i e o b i e k t ó w, a l e p o z w a l a k l a s o m p o d r z ę d n y m S i n g l e t o n — z a p e w n i a, ż e d a n a k l a s a b ę d z i e m i a ł a t y l k o M e t o d a Fa b r y k u j ą c a — d e f i c h k l a s a u t o m a t y c z n i e z a k t u a l t w o r z e n i a c a ł y c h r o d z i n e l a s t y c z n o ś ć p o d o b n ą d o t e j, o k r e ś l a n i a s w ó j j e d n a k w z a m i a n z n a c z n i e r o z s z e r z o n ą a l g o r y t m u n i e z a l e ż n i e o d k l s i e b i e o b i e k t ó w b e z k o n i e c z n o ś c i z a p e w n i a g l o b a l n y i p o w i a d o m i o n e k l a s y o b i e k t z o s t a n i e u t w o r z o n y. W z o r z e c Fa c t o r y M e t h o d p r z e k a z u j e o d p o w i e d z i a l n o ś ć z a i i n s t a n c j ę o b i e k t u o f e r u j ą c o d u ż y w a . j a k i e j j e d n ą r z e c z y w i s t y c h . d e c y d o w a ć, w y ł ą c z n i e f u n k c j o n a l n o ś ć . i n s t a n c j i p u n k t d o s t ę p u d o t e j p o d r z ę d n y c h . t w o r z e n i e o b i e k t ó w d o k l a s . i i i ! spis_tresci_00.indd 11 ! spis_tresci_00.indd 11 11 2005-06-29 10:10:38 2005-06-29 10:10:38 Wzorzec Polecenie 6 Hermetyzacja wywołań W niniejszym rozdziale przeniesiemy hermetyzację na zupełnie nowy poziom: mamy zamiar dokonać hermetyzacji wywołań metod. Zgadza się, dzięki hermetyzacji wywołań metod możemy wykrystalizować pewne fragmenty obliczeń tak, że obiekt wywołujący obliczenia nie musi się martwić, w jaki sposób je wykonać; po prostu wykorzystuje naszą metodę. Z takimi hermetyzowanymi wywołaniami metod możemy również dokonywać wielu zadziwiająco sprytnych operacji, takich jak na przykład zapisywanie ich do dzienników czy też ponowne wykorzystywanie w celu zaimplementowania mechanizmu Cofnij (ang. Undo) w naszej aplikacji. P o p r o s z ę z a p i e k a n k ę z s e r e m i n a p ó j s ł o d o w y . a si ę z h w c y a m ó w i e n i a . k b n i e s a m ó w i e Z c ji w y y z o z z p k i e a n a b l a e n n a p is d a ł n a r c i e z utwórzZamówienie() r n i a o y z ł a a m ó w i e t s o e z a r u z ó t t k i e u, k n n b l a m e Z apiekanka z sere m N apój słodo w y e, a d a z ł k c s c h i pobierzZamówienie() K li e ż, w i e j u t n n i e . a m ó w i e o g e z c K e l n e r k a p r z y jm u j e Z am ów i e n i e o d k l z t ym u p o r a, w yw o ł u j e m e t o d ę r e a l r o z p o c z y n a p r o c e s r e a l i z a c j i M e t o d a t a i e n t a . j u ż s i ę i k i e d y i e n t a i z u j Z am ów i e n i e ( ) . Z am ów i e n i a z ł o ż o n e g o p r z e z k l realizujZamówienie() u r g B e r M a lt p r z y g o t u j Z a p i e k a n k ę ( ) , p r z y g o t u j N a p ó j ( ) N a Z a m ó w ieniu zn ajd ują się w szelkie instrukcje niezbę d ne d o teg o, a b y p rzy g oto w a ć w łaści w y p osiłek. Z a m ó w ienie kieruje p ra cą K uch arz a, p osłu g ują c się m eto d a m i takim i, jak p rzy g otujZ a pieka nkę(). Kucharz realizuje instrukcje podane w Zamówieniu i przygotowuje odpowiedni posiłek. produkt końcowy Automatyka w domu i zagrodzie Mamy nową zabawkę! Sprawdzamy, jak działa SuperPilot… Co zawiera otrzymany dysk CD-R A w międzyczasie w naszym barze szybkiej obsługi… Przyjrzyjmy się nieco dokładniej wzajemnym interakcjom… Zadania i zakresy odpowiedzialności Od Baru do wzorca Polecenie Nasze pierwsze POLECENIE Definicja wzorca Polecenie Wzorzec Command i SuperPilot Implementujemy SuperPilota Sprawdzamy możliwości naszego SuperPilota Nadszedł wreszcie czas, aby utworzyć trochę dokumentacji… Implementacja mechanizmu wycofywania przy użyciu stanów Każdy pilot powinien posiadać tryb Impreza! Zastosowanie makropoleceń Kolejne zastosowania wzorca Polecenie — kolejkowanie żądań Kolejne zastosowania wzorca Polecenie — żądania rejestracji Twoja skrzynka narzędziowa Rozwiązania ćwiczeń 218 219 220 223 224 225 227 229 232 234 236 238 241 246 250 251 254 255 256 258 12 ! spis_tresci_00.indd 12 ! spis_tresci_00.indd 12 2005-06-29 10:10:41 2005-06-29 10:10:41 Wzorce Adapter oraz Fasada 7 Zdolność do adaptacji Europejski standard ściennego gniazda elektrycznego Adapter Standardowa wtyczka zasilająca W niniejszym rozdziale mamy zamiar dokonać paru niesamowitych wyczynów z dziedziny rzeczy niemożliwych, takich jak na przykład włożenie kwadratowego kołka do okrągłego otworu. Brzmi nierealnie? Nie wtedy, kiedy mamy pod ręką odpowiednie wzorce projektowe. Pamiętasz wzorzec Dekorator? Podczas pracy z nim owijaliśmy obiekty innymi obiektami tak, aby nadać im nowe zachowania. Teraz mamy zamiar postępować tak samo, ale w nieco innym celu: chcemy sprawić, by ich interfejsy wyglądały jak coś, czym nie są. Dlaczego jednak mielibyśmy to robić? Na przykład po to, aby zaadaptować projekt oczekujący danego interfejsu do klasy, która implementuje zupełnie inny interfejs. To jeszcze nie wszystko; skoro już jesteśmy przy tym temacie, przyjrzymy się również innemu wzorcowi, który owija obiekty w celu uproszczenia ich interfejsów. Adaptery są wśród nas Adaptery zorientowane obiektowo Wzorzec Adapter bez tajemnic Definicja wzorca Adapter Adaptery obiektów i klas Temat dzisiejszej wieczornej pogawędki: Adapter obiektów i Adapter klas Adaptery w świecie rzeczywistym Adaptujemy interfejs Enumeration do wymagań interfejsu Iterator Temat dzisiejszej wieczornej pogawędki: wzorce Dekorator i Adapter Nie ma to jak kino domowe Światła, kamera, fasada! Konstruujemy fasadę naszego systemu kina domowego Definicja wzorca Fasada Reguła ograniczania interakcji Twoja skrzynka narzędziowa Rozwiązania ćwiczeń 260 261 265 267 268 271 272 273 276 279 282 285 288 289 294 296 Klient żądanie() ) ( e n o z c u m a ł T n i e a d ą ż Obiekt adaptowany Klient jest zaprojektowany niezgodnie z wymogami interfejsu docelowego. Adapter e l o w y c o d s j e f r e t i n ! spis_tresci_00.indd 13 ! spis_tresci_00.indd 13 Adapter implementuje interfejs docelowy i przechowuje instancję obiektu adaptowanego. e t p k A d y d e l o w y K a I n a c o d interfejs obiektu adaptowanego i n t e r f e j s o b i e k t u I n d y k t o a d a p t ow a n e g o . e j s f r e t u j e i n t n r i m p l e m e k z c a . 13 2005-06-29 10:10:42 2005-06-29 10:10:42 Wzorzec Metoda Szablonowa 8 Hermetyzacja algorytmów Jesteśmy jak w transie: hermetyzowaliśmy już proces tworzenia obiektów, wywołania metod, złożone interfejsy, kaczki, indyki, pizze… ciekawe, co będzie następne? Otóż, teraz mamy zamiar zająć się hermetyzacją fragmentów algorytmów, tak aby klasy podrzędne mogły „podczepiać się” w różnych miejscach wykonywanych obliczeń. Co więcej, zajmiemy się również regułą projektowania, której korzenie wywodzą się w prostej linii z… Hollywood. Zauważyliśmy, że dwie receptury są bardzo do siebie podobne, chociaż niektóre ich etapy wymagają różnych implementacji. Dzięki temu spostrzeżeniu mogliśmy uogólnić recepturę i umieścić ją w klasie bazowej. 3 4 Napoje zawierające H e r b a t a Z ag r z ej o d p ow ie d nią ilo ść w o d y . Wł óż t o r e bk ę h e r b a t y d o w r zą t k u. N al ej h e r b a t y d o f ili ża nk i. D o d aj c y t r y n ę d o sm a k u. 1 2 3 4 Kawa 1 2 Zagrzej odpowiednią ilość wody. Zalej wrzątkiem odmierzoną porcję kawy. Nalej kawy do filiżanki. Dodaj cukier i mleko do smaku. uogólnienie niektóre etapy delegowane są do klasy podrzędnej P o d k l a s a H e r b a t a kofeinę 1 2 3 4 Zagrzej odpowiednią ilość wody. uogólnienie Zaparz napój. Nalej uzyskany napój do filiżanki. Domieszaj do napoju odpowiednie dodatki. niektóre etapy delegowane są do klasy podrzędnej Podklasa Kawa 2 4 Włóż torebkę herbaty do wrzątku. Dodaj cytrynę. Klasa NapójZKofeiną doskonale zna poszczególne etapy receptury, choć sama wykonuje tylko etap pierwszy izację , zostawiając real i trzeci etapów drugiego i czwartego klasom Kawa i Herbata. Z a p a r z o d m ie r zoną p o r cję k a w y . D o daj c uk ie r i mle k o. 2 4 Tworzymy klasy reprezentujące kawę i herbatę (w języku Java) Kawa i herbata, czyli klasy abstrakcyjne Ciągniemy nasz projekt o krok dalej… Wydobywanie metody recepturaParzenia() Czego już dokonaliśmy? Spotkanie z wzorcem Metoda Szablonowa Zróbmy sobie herbatę… Co nam daje zastosowanie metody szablonowej? Definicja wzorca Metoda Szablonowa Bliskie spotkania z kodem aplikacji Haczyk na wzorzec Metoda Szablonowa… Zastosowanie haczyka Testujemy naszą aplikację Reguła Hollywood Reguła Hollywood a wzorzec Metoda Szablonowa Wzorzec Metoda Szablonowa w głębokiej kniei… Sortowanie przy użyciu wzorca Metoda Szablonowa A teraz musimy posortować trochę kaczek… Porównywanie kaczek z innymi kaczkami Robimy maszynę do sortowania kaczek Zabawy z ramkami Aplety Java Temat dzisiejszej wieczornej pogawędki: wzorce Metoda Szablonowa oraz Strategia Twoja skrzynka narzędziowa Rozwiązania ćwiczeń 299 302 303 304 307 308 309 310 311 312 314 315 316 318 319 321 322 323 324 326 328 329 330 332 333 14 ! spis_tresci_00.indd 14 ! spis_tresci_00.indd 14 2005-06-29 10:10:44 2005-06-29 10:10:44 Wzorce Iterator i Kompozyt 9 Zarządzanie kolekcjami Jest wiele sposobów grupowania obiektów w kolekcje. Można utworzyć obiekty Array, Stack, List, Hashtable. Każdy z nich ma swoje zalety i wady. Jednak w pewnym momencie klient rozpocznie iteracyjne przetwarzanie elementów kolekcji. Czy wtedy ujawnisz mu swoją implementację? Mam nadzieję, że nie. To nie byłoby profesjonalne. Nie musisz się jednak obawiać, Twoja kariera zawodowa nie jest zagrożona. W tym rozdziale przedstawimy metodę, która umożliwia klientom przetwarzanie iteracyjne bez wiedzy o tym, jak obiekty są przechowywane. Przedstawimy też technikę tworzenia superkolekcji (ang. super collections) obiektów, które pozwalają na obsługę bardzo rozbudowanych struktur danych. Będziemy też pisać o odpowiedzialności obiektów. To jest kolekcja ArrayList, która przechowuje menu poszczególnych restauracji. Wszystkie menu p ancakeHo u s 1 e Menu DinerMe n 2 u u n UJackaM e 3 Menu restauracji Pancake House Menu restauracji U Jacka Pozycja M e n u Pozycja M e n u Pozycja M e n u Pozycja M e n u 2 3 1 4 ArrayList Menu deserów 1 2 3 Pozycja M e n u Pozycja M e n u Pozycja M e n u Menu restauracji Diner tablica 1 2 3 4 Pozycja M e n u Pozycja M e n u Pozycja M e n u Pozycja M e n u klucz klucz klucz klucz Pozycja M e n u Pozycja M e n u Pozycja M e n u Pozycja M e n u Hashtable Kolekcja DinerMenu ma przechowywać podmenu. Jednak nie możemy wprowadzić menu jako elementu tablicy ze względu na niezgodność typów. Fuzja restauracji Diner i Pancake House Implementacje menu Łukasza i Miłosza Czy można hermetyzować iteracje? Wzorzec Iterator Wiązanie iteratora z obiektem menu Co już mamy… Szersze spojrzenie na kod naszego projektu Uproszczenia po wprowadzeniu interfejsu java.util.Iterator Jaki jest efekt końcowy? Definicja wzorca Iterator Jeden zakres odpowiedzialności Iteratory i kolekcje Iteratory i kolekcje w języku Java 5 I gdy już miało być tak dobrze… Definicja wzorca Kompozyt Projektujemy menu oparte na wzorcu Kompozyt Implementacja klasy Menu Powracamy do iteratora IteratorPusty Wzorce Iterator i Kompozyt razem… Twoja skrzynka narzędziowa Rozwiązania ćwiczeń 336 338 343 345 347 351 353 355 356 359 368 369 373 376 379 382 388 392 394 399 400 15 ! spis_tresci_00.indd 15 ! spis_tresci_00.indd 15 2005-06-29 10:10:45 2005-06-29 10:10:45 Wzorzec Stan 10 Stan obiektu Mało znany fakt: wzorce Strategy i State to bliźniaki, rozdzielone zaraz po narodzinach. Jak już wiemy, wzorzec Strategy umożliwił przeprowadzenie wielu niezwykle udanych przedsięwzięć opartych na zamiennie stosowanych algorytmach. Wzorzec State ma inną rolę. Jest nią wspomaganie obiektów w kontrolowaniu ich własnych zachowań poprzez wewnętrzną zmianę stanu. Łatwo usłyszeć, jak mówi swoim podopiecznym: „Powtarzaj za mną: jestem wystarczająco zdolny, jestem wystarczająco dobry, dam radę to zrobić…”. Krótka narada Maszyny stanowe 101 Piszemy kod Wiedziałeś, że to jest blisko… zmiana! Kłopotliwy STAN rzeczy… Definiowanie interfejsów i klas reprezentacji stanu Implementowanie klas Stan Nowa wersja automatu sprzedającego Definicja wzorca Stan Wzorzec Stan kontra wzorzec Strategia Wzorzec Stan, weryfikacja projektu Niemal zapomnieliśmy! Twoja skrzynka narzędziowa Rozwiązania ćwiczeń 405 406 408 412 414 417 419 420 428 429 435 438 441 442 Automaty Sprzedające SA gdzie automatyczny sprzedawca nigdy nie jest w połowie pusty… B r g a u k m Poniżej przedstawiamy naszą koncepcję pracy kontrolera automatu sprzedającego gumę do żucia. Mamy nadzieję, że zaimplementowanie tego schematu w Javie nie sprawi Wam trudności. W przyszłości będziemy zapewne dodawać nowe zachowania, więc prosimy o projekt możliwie elastyczny i łatwy do modyfikowania. — Inżynierowie firmy Automaty Sprzedające y t e n o nie m a d a ł k w t t e s e n a J m o N i e m e n m o t a y przekręcanie gałki y t e n o nie m a c a r w z liczbaGum 0 liczbaGum = 0 n i e w y d a w a u m y g a e z d m r G u s p a n a 16 ! spis_tresci_00.indd 16 ! spis_tresci_00.indd 16 2005-06-29 10:10:45 2005-06-29 10:10:45 Wzorzec Proxy 11 Kontrola dostępu do obiektu Próbowałeś kiedyś stosować metodę „dobrego i złego”? Ty jesteś tym dobrym, który zrobi wszystko, o co się go poprosi, który jest zawsze miły i uprzejmy. Nie chcesz jednak, żeby każdy mógł prosić o Twoje usługi. To jest miejsce dla „złego”, który będzie kontrolował dostęp do Ciebie. Takie jest właśnie zadanie pośredników (ang. proxy) w modelu obiektowym — kontrolowanie i zarządzanie dostępem. Jak się przekonamy, istnieje bardzo wiele schematów takiego pośrednictwa. Obiekty Proxy mogą przekazywać wywoływanie metody obiektowi w innym węźle internetu; bywa też, że zastępują wyjątkowo leniwe obiekty. B r z y d k i Ł a d n y Kontrolowania stanu automatów sprzedających Rola „zdalnego pośrednika” RMI — wycieczka z przewodnikiem Zdalny pośrednik automatu sprzedającego Pośrednik zdalny, za kulisami Definicja wzorca Proxy Pośrednik wirtualny Projektowanie wirtualnego pośrednika do wyświetlania okładek Pośrednik wirtualny, za kulisami Wykorzystanie mechanizmów Java API Teatrzyk — ochrona przedmiotów Budowanie dynamicznego pośrednika ZOO pośredników Twoja skrzynka narzędziowa Rozwiązania ćwiczeń 448 452 455 468 476 478 480 482 488 492 496 497 506 508 509 interface Przedmiot żądanie() interface InvocationHandler invoke() N a p o ś r e d n i k a s k ł a d a j ą s i ę t e r a z d w i e k l a s y. PrawdziwyPrzedmiot żądanie() Proxy żądanie() InvocationHandler invoke() ! spis_tresci_00.indd 17 ! spis_tresci_00.indd 17 17 2005-06-29 10:10:46 2005-06-29 10:10:46 Wzorce złożone 12 Łączenie wzorców Przyszłoby Ci do głowy, że wzorce mogą pracować razem? Byliśmy już świadkami wielu niespokojnych „Pogawędek przy kominku” (a ominął Cię „Death Match” wzorców, który wydawca kazał wyrzucić) — czy wsłuchując się w ich ton, można jeszcze liczyć na to, że wzorce będą ze sobą współpracować? Możesz wierzyć lub nie, ale najbardziej wyszukane projekty obiektowe wykorzystują wiele wzorców jednocześnie. Przygotuj się na kolejny poziom wiedzy o wzorcach projektowych. Czas na wzorce złożone. Beat jest ustawiony na 119 BPM i chcemy zwiększyć szybkość do 120 BPM. Klikamy przycisk zwiększający szybkość… Widok … co powoduje wywołanie kontrolera. Controler Pasek beatu pulsuje co pół sekundy. Widok Ponieważ szybkość beatu to 120 BPM, widok jest uaktualniany co pół sekundy. Widok zostaje uaktualniony, aby wyświetlał 120 BPM. Widok jest powiadamiany o zmianie BPM. Wywołuje metodę modelu pobierzBPM(). Kontroler żąda od modelu zwiększenia wartości BPM o jeden. e B a tModel s t a r t ( ) stop() ustawBPM() p o b i e r z B P M ( ) Wzorzec złożony Powrót kaczek Potrzebujemy adaptera gęsi Wprowadzamy zliczanie kwaknięć Fabryka produkująca kaczki Tworzymy stado kaczek Przygotowanie interfejsu Observable Co zrobiliśmy? Widok z lotu kaczki — diagram klas Model-Widok-Kontroler — piosenka Kluczem do schematu MVC będą wzorce projektowe Spojrzenie na schemat Model-Widok-Kontroler przez pryzmat wzorców Wykorzystujemy MVC do sterowania beatem... Piszemy kod elementów Widok A teraz kontroler Eksplorujemy możliwości wzorca Strategia Adaptowanie modelu Nowy kontroler — SerceKontroler Wzorzec MVC i sieć WWW Model 2 a wzorce projektowe Twoja skrzynka narzędziowa Rozwiązania ćwiczeń 518 519 522 524 526 531 534 541 542 544 546 550 552 555 557 560 563 564 565 567 575 578 579 18 ! spis_tresci_00.indd 18 ! spis_tresci_00.indd 18 2005-06-29 10:10:46 2005-06-29 10:10:46 Nowe życie z wzorcami 13 Wzorce projektowe w praktyce Ach, jesteś już gotowy na spotkanie z nowym wspaniałym światem pełnym wzorców projektowych… Ale zanim rozpoczniesz wędrówkę ku nowym horyzontom, poświęć chwilę na przeczytanie rozdziału poświęconego pewnym szczególnym kwestiom, które pojawiają się, gdy rozpoczynasz stosowanie wzorców w codziennej pracy. Nie wszędzie jest tak pięknie, jak w Obiektowie. Przygotowaliśmy więc mały przewodnik, który pomoże Ci odnaleźć się w twardej rzeczywistości… P r z e w o d n i k n a n o w e ż y c i e z w z o r c a m i P r z y j m i j , p r o s z ę , n a s z p o d r ę c z n y z b i ó r p o r a d , k t ó r e p o m o g ą C i ż y ć z w z o r c a m i p r o j e k t o w y m i w c o d z i e n n e j p r a c y i z m a g a n i a c h . n i e p o r o z u m i e n i a c h z w i ą z a n y c h z t e r m i n e m „ w z o r z e c p r o j e k t o w y ” ; (cid:87) B ę d z i e m y w n i m m ó w i ć o : k a t a l o g a c h w z o r c ó w p r o j e k t o w y c h (cid:67) (cid:67) u n i k a n i u s t o s o w a n i a w z o r c ó w t a m , g d z i e n i e p r z y d a ć ; (cid:67) w ł a ś c i w y m k l a s y f i k o w a n i u w z o r c ó w ; d e f i n i o w a n i u w z o r c ó w p r o j e k t o w y c h z a r e z e r w o w a n e d l a w y b r a n y c h . D o w i e s z s i ę , ć w i c z e n i a c h u m y s ł u , k t ó r e t r a k t u j e m y z r ó w n ą p o w a g ą , w z o r c ó w ; (cid:87) U j a w n i m y t o ż s a m o ś ć G a n g u C z t e r e c h — t a j e m n i c z e g o G a n g o f Fo u r. m i s t r z o w i e Z e n . p o w i n i e n m i e ć k a ż d y u ż y t k o w n i k w z o r c ó w w p ł y w a ć n a p r o g r a m i s t ó w, s t o s u j ą c j a k b a r d z o m o g ą C i j e s t t o p o t r z e b n e ; j e s t t o z a j ę c i e j a k z o s t a ć a u t o r e m o t y m , ż e n i e o t y m , j a k i e k s i ą ż k i j a k z d o b y ć p r z y j a c i ó ł (cid:87) Z d r a d z i m y, p r o j e k t o w y c h . p r e c y z y j n ą t e r m i n o l o g i ę w z o r c ó w p r o j e k t o w y c h . (cid:87) O p o w i e m y, i s i ę (cid:67) (cid:67) (cid:67) i i j a k Przewodnik na nowe życie z wzorcami Definicja wzorca projektowego Drugie spojrzenie na definicję wzorca Niech moc będzie z Tobą Katalog wzorców Jak tworzyć wzorce Zostać autorem wzorców projektowych Porządkowanie wzorców projektowych Myślenie wzorcami Głowa pełna wzorców Nie zapominaj o potędze jednolitego słownictwa Pięć podstawowych sposobów promowania Twojego słownictwa Gang Czterech w Obiektowie Podróż dopiero się zaczyna… Inne źródła informacji o wzorcach ZOO pełne wzorców Walka ze złem przy użyciu antywzorców Twoja skrzynka narzędziowa Opuszczamy Obiektowo… 596 597 599 600 601 604 605 607 612 615 617 618 619 620 621 622 624 626 627 d r a h e l m R i c H Ralph Johnson Gang Czterech John Vlissides Erich Gamma ! spis_tresci_00.indd 19 ! spis_tresci_00.indd 19 19 2005-06-29 10:10:47 2005-06-29 10:10:47 14 Dodatek — inne wzorce Nie wszyscy mogą być sławni. Przez ostatnie dziesięć lat wiele się w świecie wzorców zmieniło. Od czasu pierwszego wydania książki Design Patterns: Elements of Reusable Object-Oriented Software (Wzorce projektowe) programiści wykorzystali opisane w nich schematy tysiące razy. Wzorce, które zebraliśmy w tym dodatku, to dopracowane, kompletne, „oficjalne” wzorce grupy GoF. Różnią się od wcześniej opisanych tylko tym, że nie spotkamy ich tak często, jak tych, którym poświęciliśmy całe rozdziały. Nie umniejsza to ich zalet i nie powinno zniechęcać do ich stosowania tam, gdzie wymaga tego sytuacja. Celem niniejszego dodatku jest zapewnienie Ci szerszej orientacji w najłatwiej dostępnych zasobach zgromadzonej przez lata wiedzy. Bridge (most) Builder (budowniczy) Chain of Responsibility (łańcuch odpowiedzialności) Flyweight (waga piórkowa) Interpreter (interpreter) Mediator (mediator) Memento (memento) Prototype (prototyp) Visitor (gość) Jedyne, czego wymagamy od klas kompozytu, to metody pobierzStan() (i tego, żeby nie obawiały się ujawnienia). Klasa Gość musi mieć możliwość wywołania metody pobierzStan() każdej z klas. Jest miejscem, gdzie można wprowadzić nowe metody, z których będą korzystać klienty. p o b i e r z S t a n ( ) Menu pobierzStan() Gość p o pobierzStan() pobierzStan() b ie r z S t a n ( ) Pozycja Menu Pozycja Menu Klient żąda, aby Gość pobrał informacje ze struktury Kompozytu… Dodawanie nowych metod klasy Gość nie wpływa na kompozyt. p o bierz W skaźnik W arto ś ci Z dro w otn ej() p o bierz K alorie() p o bierz W ę glo w o d a n y() p o bierz Białka() Klient i Obiekt przechodzenia Obiekt przechodzenia (Traverser) umie przeprowadzić Gościa przez całą strukturę kompozytową. Składnik Składnik S Skorowidz 20 ! spis_tresci_00.indd 20 ! spis_tresci_00.indd 20 630 632 634 636 638 640 642 644 646 649 2005-06-29 10:10:47 2005-06-29 10:10:47 Rozdział 2. Wzorzec Obserwator  Jak sprawić, by Twoje obiekty były zawsze  dobrze poinformowane  Cześć, Jarek, właśnie dzwonię po kolei do wszystkich z informacją, że spotkanie naszej grupy użytkowników wzorców zostało przeniesione na sobotni wieczór. Będziemy omawiać wzorzec Obserwator. Tak, ten wzorzec jest najlepszy. Jarek, on jest po prostu NAJLEPSZY! Nie przegap okazji, kiedy dzieje się coś naprawdę ciekawego! Przedstawimy Ci wzorzec, który potrafi poinformować inne obiekty o tym, że wydarzyło się coś, czym powinny się zająć. Co ciekawe, obiekty mogą nawet samodzielnie decydować w czasie działania programu o tym, czy chcą być informowane o takich wydarzeniach. Wzorzec Obserwator jest jednym z najczęściej wykorzystywanych wzorców w pakiecie JDK (ang. Java Development Kit), a co najważniejsze — jest wręcz niewiarygodnie użyteczny. W niniejszym rozdziale rzucimy również okiem na relacje typu jeden-do-wielu oraz tzw. luźne związki (tak, to prawda, napisaliśmy „luźne związki”). Korzystając z wzorca Obserwator, z pewnością odmienisz swoje życie. to jest nowy rozdział 67 rozdzial_02_kor_II.indd 67 rozdzial_02_kor_II.indd 67 2005-06-29 09:49:22 2005-06-29 09:49:22 Stacja meteorologiczna Gratulacje! Wasz zespół właśnie wygrał kontrakt na budowę Pogodynki 2, najnowszej generacji internetowej stacji sprawdzającej i podającej aktualną pogodę. z o . o . P o g o d y n k a s p . D e s z c z o w a 2 5 . u l 0 0 - 0 0 0 Ś n i e g o w o O ś w i a d c z e n i e o w s p ó ł p r a c y C h c i e l i b y ś m y z ł o ż y ć s e r d e c z n e g r a t u l a c j e z o k a z j i w y g r a n i a p r z e z P a ń s t w a fi r m ę k o n t r a k t u n a b u d o w ę n a s z e j n a j n o w s z e j g e n e r a c j i i n t e r n e t o w e j s t a c j i o p a t e n t o w a n y m S t a c j a m e t e o r o l o g i c z n a o p a r t a b ę d z i e n a n a s z y m z n a k o m i t y m , k t ó r y a u t o m a t y c z n i e ś l e d z i b i e ż ą c e w a r u n k i p o g o d o w e m e t e o r o l o g i c z n e j ! C h c i e l i b y ś m y , w i l g o t n o ś ć o r a z c i ś n i e n i e a t m o s f e r y c z n e ) . k t ó r a p o c z ą t k o w o b ę d z i e m i a ł a z a z a d a n i e o b i e k c i e D a n e P o g o d o w e , w y ś w i e t l a ć n a e k r a n i e t r z y g ł ó w n e e l e m e n t y : i n f o r m a c j ę o b i e ż ą c y c h w a r u n k a c h ( t e m p e r a t u r a o t o c z e n i a , w s z y s t k i e a b y W a s z a fi r m a u t w o r z y ł a a p l i k a c j ę , d a n e s t a t y s t y c z n e o p o g o d z i e o r a z p r o s t ą p r o g n o z ę p o g o d y , g d y o b i e k t D a n e P o g o d o w e o t r z y m a a k t u a l i z o w a n e w c z a s i e r z e c z y w i s t y m w c h w i l i , p o g o d o w y c h , n a j n o w s z e o d c z y t y z u r z ą d z e ń p o m i a r o w y c h . ż e j e s t t o p e r s p e k t y w i c z n a w e r s j a s t a c j i N a s z a fi r m a c h c e w n a j b l i ż s z e j p r z y s z ł o ś c i w y p u ś c i ć n a r y n e k k t ó r a u m o ż l i w i i n n y m p r o j e k t a n t o m t w o r z e n i e M u s i m y j e d n a k p a m i ę t a ć o t y m , w ł a s n y c h s p o s o b ó w w y ś w i e t l a n i a i n f o r m a c j i o p o g o d z i e i ł a t w e d o ł ą c z a n i e t a k i c h m e t e o r o l o g i c z n e j . a b y W a s z a fi r m a w e r s j ę A P I d o s t a c j i P o g o d y n k a 2 , m o d u ł ó w d o g ł ó w n e g o o p r o g r a m o w a n i a s t a c j i . ż e n a s z a fi r m a r e a l i z u j e z n a k o m i t y b i z n e s p l a n : p o p o d p i s a n i u u m o w y d o s t a r c z y ł a n a m p i e r w s z ą w e r s j ę t a k i e g o A P I . z k l i e n t e m m a m y z a m i a r o b c i ą ż a ć g o d o d a t k o w y m i k o s z t a m i z a k a ż d y p a n e l A t e r a z n a j l e p s z a c z ę ś ć : o c z e k u j e m y , ż e a k c e p t o w a n ą p r z e z W a s f o r m ą p ł a t n o ś c i b ę d ą o p c j e n a z a k u p a k c j i n a s z e j U w a ż a m y , w y ś w i e t l a j ą c y i n f o r m a c j e z n a s z e j s t a c j i . Z n i e c i e r p l i w o ś c i ą o c z e k u j e m y n a p r o j e k t s t a c j i o r a z w e r s j ę a l f a a p l i k a c j i s t e r u j ą c e j . w s p a n i a ł e j fi r m y ! P l i k i ź r ó d ł o w e z a w i e r a j ą c e k o d n a s z e g o o p a t e n t o w a n e g o o b i e k t u D a n e P o g o d o w e w y ś l e m y d o P a ń s t w a k u r i e r e m j e s z c z e d z i ś w n o c y . J a n u s z M o n s u n , P. S . Z p o w a ż a n i e m , C h c i e l i b y ś m y , P r e z e s 68 Rozdział 2 rozdzial_02_kor_II.indd 68 rozdzial_02_kor_II.indd 68 2005-06-29 09:49:31 2005-06-29 09:49:31 Wzorzec Obserwator Ogólne spojrzenie na aplikację sprawdzającą warunki pogodowe Trzema głównymi graczami w naszym systemie są: stacja meteorologiczna (fizyczne urządzenie zbierające dane z czujników temperatury, ciśnienia i wilgotności), obiekt DanePogodowe (który zapewnia śledzenie danych nadchodzących z tej stacji oraz aktualizuje informacje wyświetlane na ekranie) oraz sam wyświetlacz, którego zadaniem jest zobrazowanie w postaci czytelnej dla użytkownika informacji o bieżących warunkach pogodowych. b i e ż ą c e ” t o j e d e n z d o s t ę p n y c h t r y b ó w U ż y t k o w n i k m o ż e r ó w n i e ż „Wa r u n k i i i n f o r m a c j z a ż y c z y ć s o b i e w y ś w i e t l e n i a d a n y c h s t a t y s t y c z n y c h w y ś w i e t l a n i a o p o g o d z i e d l a n a s z e g o r e g i o n u ( t r y b „ S t a t y s t y k a ” ) p r o g n o z y p o g o d y ( t r y b „ P r o g n o z a ” ) . t e ż p r o s t e j . l u b Czujnik wilgotności pobiera dane wyświetla Termometr Barometr Obiekt DanePogodowe Stacja meteorologiczna Warunki bieżące Temp. 22OC Wilgotność 60 Ciśnienie Wyświetlacz Elementy dostarczane przez firmę Pogodynka sp. z o.o. Elementy, które musimy zaimplementować Obiekt DanePogodowe „wie”, w jaki sposób należy komunikować się z fizyczną stacją meteorologiczną tak, aby otrzymywać aktualne odczyty danych. Po otrzymaniu danych obiekt aktualizuje wyświetlane informacje dla trzech głównych trybów pracy: „Warunki bieżące” (tryb ten pokazuje informacje na temat temperatury otoczenia, wilgotności oraz ciśnienia atmosferycznego), „Statystyka” oraz „Prognoza”. Jeżeli zdecydujemy się na zaakceptowanie tego kontraktu, naszym zadaniem będzie stworzenie aplikacji, która będzie wykorzystywała obiekt DanePogodowe do aktualizacji informacji wyświetlanych w trzech głównych trybach pracy. rozdzial_02_kor_II.indd 69 rozdzial_02_kor_II.indd 69 2005-06-29 09:49:32 2005-06-29 09:49:32 jesteś tutaj(cid:1) 69 Klasa DanePogodowe Rozpakowywanie klasy DanePogodowe Jak zostało obiecane, następnego dnia rano kurier dostarczył pliki źródłowe klasy DanePogodowe. Kiedy rzuciliśmy okiem na jej kod, wszystko stało się jasne: PogodaDane pobierzTemperaturę() pobierzWilgotność() pobierzCiśnienie() odczytyZmiana() // inne metody a l n u t k o y, w il g a j ą a r u t c a a r z y m e o d y z w r t r t T e e m p e t o d p o w i e d n i o : o . g e n z c y r e f s t m o a a w i a t s o, J A K u t a m y o o d a D a N i e d b g P o t k b i e h ; o c j e z c y n n r m a z m i e o f e i n n o w a a li z t k a z u y z z a z ś c c i t r y z e o d c c i o ś o n t ó w, u j n i k n i a n i e ś n o t r ą w a s e ”, w j a „ w i e e e t c ji m e a t s e n c y t s p o o l o h ó s g i c c i k i r o r t e j. b o n z y m a z ć k l a s y D a n e Po g o d o w e p r o j e k t a n c i c o n a m w s k a z ó w k ę n a t e m a t t e g o, d o ł o ż y ć … J a k w i d a ć, i l z o s t a w i m u s i m y t u t a j Pamiętaj, że tryb „Warunki bieżące” jest tylko JEDNYM z trzech dostępnych trybów wyświetlania informacji. /* * Ta metoda jest wywoływana * za każdym razem, kiedy zostaną zaktualizowane * odczyty z czujników pogody * */ public void odczytyZmiana() { // tutaj umieść odpowiedni kod } plik DanePogodowe.java Nasze zadanie polega na implementacji metody odczytyZmiana(), tak aby była ona w stanie automatycznie aktualizować informacje wyświetlane w trybach „Warunki bieżące”, „Statystyka” oraz „Prognoza”. Warunki bieżące Temp. 22 C Wilgotność 60 Ciśnienie Wyświetlacz 70 Rozdział 2 rozdzial_02_kor_II.indd 70 rozdzial_02_kor_II.indd 70 2005-06-29 09:49:33 2005-06-29 09:49:33 O czym wiemy do tej pory? Specyfikacja nadesłana z firmy Pogodynka sp. z o.o. nie była do końca jasna, więc musieliśmy się zorientować, co tak naprawdę mamy zrobić. Podsumujmy zatem, czego dowiedzieliśmy się dotychczas: (cid:53) Klasa DanePogodowe posiada odpowiednie metody, umożliwiające pobieranie trzech mierzonych wartości (temperatury otoczenia, wilgotności oraz ciśnienia atmosferycznego) z czujników fizycznych. (cid:53) Metoda odczytyZmiana() jest wywoływana za każdym razem, kiedy pojawiają się nowe dane z czujników fizycznych (nie wiemy, a w zasadzie nawet nie dbamy o to, w jaki sposób ta metoda jest wywołana; wiemy tylko, że tak po prostu działa). (cid:53) Musimy zaimplementować obsługę trzech trybów wyświetlania wykorzystujących dane o pogodzie: trybu Warunki bieżące, trybu Statystyka oraz trybu Prognoza. Dane wyświetlane w poszczególnych trybach muszą być na bieżąco aktualizowane za każdym razem, kiedy obiekt DanePogodowe zyskuje odczyty nowych pomiarów. (cid:53) Cały system musi być łatwy do rozbudowy — inni projektanci mogą tworzyć swoje własne, nowe tryby wyświetlania danych, a użytkownicy mogą dodawać do aplikacji bądź usuwać z niej dowolną ilość trybów wyświetlania. W chwili obecnej znamy tylko trzy początkowe tryby wyświetlania danych („Warunki bieżące”, „Statystyka” oraz „Prognoza”). Wzorzec Obserwator pobierzTemperaturę() pobierzWilgotność() pobierzCiśnienie() odczytyZmiana() Warunki bieżące Temp. 22 C Wilgotność 60 Ciśnienie Pierwszy tryb wyświetlania Statystyka Średnia temp.: 16,6 C Min. temp.: 10 C Max. temp.: 25,5 C Drugi tryb wyświetlania Prognoza (cid:55) (cid:55) (cid:55) Trzeci tryb wyświetlania ? Przyszłe tryby wyświetlania jesteś tutaj(cid:1) 71 rozdzial_02_kor_II.indd 71 rozdzial_02_kor_II.indd 71 2005-06-29 09:49:33 2005-06-29 09:49:33 Pierwsze kroki ze stacją meteorologiczną Pierwszy, pozorny sukces w walce ze stacją meteorologiczną Poniżej przedstawiamy pierwszy wariant implementacji naszego systemu — skorzystamy tu z porady, jaką nam przekazali programiści z firmy Pogodynka sp. z o.o., i umieścimy nasz kod wewnątrz metody odczytyZmiana(): public class DanePogodowe { // deklaracje zmiennych obiektowych public void odczytyZmiana() { float temp = pobierzTemperaturę(); float wilgotność = pobierzWilgotność(); float pressure = pobierzCiśnienie(); Pobierz najbardziej aktualne odczyty, wywołując odpowiednie metody umożliwiające pobieranie trzech mierzonych wartości z czujników fizycznych (metody zostały już wcześniej zaimplementowane). warunkiBieżąceWyświetl.aktualizacja(temp, wilgotność, ciśnienie); statystykaWyświetl.aktualizacja(temp, wilgotność, ciśnienie); prognozaWyświetl.aktualizacja(temp, wilgotność, ciśnienie); } // w tym miejscu można wstawić inne metody obiektu PogodaDane } W y w o ł u j e k a ż d y w y ś w i e t l a n y e l e m e n t p r z e k a z u j e m u d o w y ś w i e t l a n i a n a j b a r d z i e j o d c z y t ó w z o d p o w i e d n i e g o a k t u a l n e w a r t o ś c i c z u j n i k a . i Aktualizacja wyświetlanych informacji… Zaostrz ołówek Opierając się na pierwszej implementacji naszego systemu, określ, które z wymienionych zdarzeń są prawdziwe. (Zaznacz wszystkie poprawne odpowiedzi). A. (cid:137) Tworzymy poszczególne implementacje, a nie interfejsy. B. (cid:137) Dodanie nowego trybu wyświetlania będzie każdorazowo wymuszało modyfikację kodu programu. C. (cid:137) Nie mamy żadnych możliwości dodawania (lub usuwania) wybranych trybów wyświetlania podczas działania programu. D. (cid:137) Poszczególne wyświetlane elementy nie posiadają wspólnego interfejsu. E. (cid:137) Nie dokonaliśmy hermetyzacji tych elementów aplikacji, które się zmieniają. F. (cid:137) Naruszyliśmy hermetyzację klasy DanePogodowe. 72 Rozdział 2 rozdzial_02_kor_II.indd 72 rozdzial_02_kor_II.indd 72 2005-06-29 09:49:34 2005-06-29 09:49:34 Co jest nie tak z naszą implementacją? Powróć na chwilę myślami do tych wszystkich pojęć i reguł, o których wspominaliśmy w rozdziale 1… Wzorzec Obserwator public class PogodaDane { // deklaracje zmiennych obiektowych public void odczytyZmiana() { float temp = pobierzTemperaturę(); float wilgotność = pobierzWilgotność(); float pressure = pobierzCiśnienie(); Obszar zmian, powinniśmy zatem dokonać jego hermetyzacji. warunkiBieżąceWyświetl.aktualizacja(temp, wilgotność, ciśnienie); statystykaWyświetl.aktualizacja(temp, wilgotność, ciśnienie); prognozaWyświetl.aktualizacja(temp, wilgotność, ciśnienie); } Wygląda na to, że przynajmniej staramy się używać wspólnego, jednolitego interfejsu dla wyświetlanych elementów… Wszystkie posiadają metodę aktualizacja(), której argumentami są wartości temperatury otoczenia, wilgotności oraz ciśnienia atmosferycznego. W przypadku tworzenia poszczególnych implementacji nie mamy żadnych możliwości dodawania ani usuwania wyświetlanych elementów bez dokonywania modyfikacji w kodzie programu. Hmmmm, ja wiem, że jestem tutaj nowy, ale ponieważ znajdujemy się właśnie w rozdziale dotyczącym wzorca Obserwator, może w końcu zaczęlibyśmy z niego korzystać? Rzucimy teraz okiem na wzorzec Obserwator, a następnie powrócimy do naszej aplikacji i pokażemy, w jaki sposób można zastosować go do aplikacji obsługującej stację meteorologiczną. jesteś tutaj(cid:1) 73 rozdzial_02_kor_II.indd 73 rozdzial_02_kor_II.indd 73 2005-06-29 09:49:34 2005-06-29 09:49:34 Spotkanie z wzorcem Obserwator Spotkanie z wzorcem Obserwator Zapewne wiesz, w jaki sposób działa prenumerata gazet i czasopism: 1 2 3 4 Wydawca nowej gazety lub czasopisma rozpoczyna swoją działalność i na rynku pojawia się nowy tytuł prasowy. Zamawiasz prenumeratę u danego wydawcy i od tego momentu za każdym razem, kiedy pojawia się nowe wydanie, zostaje Ci ono dostarczone. Całość działa tak długo, jak długo pozostajesz prenumeratorem danego tytułu prasowego. Jeżeli nie chcesz więcej otrzymywać danej gazety lub czasopisma, po prostu wypowiadasz prenumeratę i od tego momentu nowe wydania przestają do Ciebie docierać. Jak długo dany wydawca (czy też dany tytuł prasowy) istnieje na rynku, tak długo różni ludzie, firmy, hotele, linie lotnicze itp. będą ustawicznie dokonywały nowych prenumerat i wypowiadały stare prenumeraty. Tęsknisz za nowymi informacjami z Obiektowa? Nie ma innego wyjścia, musimy zaprenumerować tamtejszą gazetę codzienną! 74 Rozdział 2 rozdzial_02_kor_II.indd 74 rozdzial_02_kor_II.indd 74 2005-06-29 09:49:34 2005-06-29 09:49:34 Wydawca + Prenumerator = wzorzec Obserwator Wzorzec Obserwator Jeżeli rozumiesz zasady prenumerowania gazet i czasopism, oznacza to, że całkiem dobrze rozumiesz zasady funkcjonowania wzorca Obserwator, z tym tylko, że we wzorcu zamiast wydawcy występuje PODMIOT (obiekt obserwowany), a zamiast prenumeratorów występują OBIEKTY OBSERWATORZY (obiekty obserwujące). Przyjrzyj się, jak to wygląda: Obiekty obserwujące posiadają subskrypcję na otrzymywanie zaktualizowanych danych za każdym razem, kiedy informacje, jakie posiada obiekt obserwowany, ulegają zmianie. Kiedy dane w obiekcie obserwowanym ulegną zmianie, wszystkie obiekty obserwujące (obiekty Obserwatorzy) zostają o tym poinformowane. Po d m i o t z a r z ą d z a n i a p e w n y m i d a n y m i . 2 liczba całkowita Obiekt obse r w owany 2 2 2 Jeżeli nastąpi zmiana danych, ich nowe wartości są przekazywane do obiektów obserwujących. Ten obiekt nie jest obserwatorem, więc nie zostaje poinformowany o zmianach, jakie zachodzą w danych obiektu obserwowanego. Obiekt K aczka Obiekt Pies Obiekt K ot Obiekt Mysz Obiekty obserwujące rozdzial_02_kor_II.indd 75 rozdzial_02_kor_II.indd 75 2005-06-29 09:49:35 2005-06-29 09:49:35 jesteś tutaj(cid:1) 75 Dzień z życia wzorca Obserwator Dzień z życia wzorca Obserwator Obiekt Kaczka pojawia się i następnie informuje obiekt obserwowany, że chciałby zostać jego obserwatorem. Obiekt Kaczka tak naprawdę chce tylko jednego: danych, jakie obiekt obserwowany wysyła za każdym razem, kiedy zmienia się jego stan. Obiekt Kaczka jest teraz oficjalnie uznanym obserwatorem. Kaczka jest podekscytowana… znajduje się już na liście i z niecierpliwością oczekuje na nadejście pierwszych informacji od obiektu obserwowanego. Obiekt obserwowany otrzymuje nowe dane! W takiej sytuacji obiekt Kaczka oraz pozostałe obiekty obserwujące otrzymują powiadomienie, że obiekt obserwowany zmienił stan. 76 Rozdział 2 zarejestruj mnie (dopisz mnie do listy subskrybentów)” w owany 2 Obiekt obse r liczba całkowita Obiekt K aczka 2 Obiekt obse r liczba całkowita wowany 8 Obiekt obse r liczba całkowita wowany Obiekt Pies Obiekt K ot Obiekt Mysz Obiekty obserwujące Obiekty obserwujące 8 8 8 8 Obiekt Pies Obiekt k a czka Obiekt K ot Obiekt Mysz Obiekty obserwujące rozdzial_02_kor_II.indd 76 rozdzial_02_kor_II.indd 76 2005-06-29 09:49:35 2005-06-29 09:49:35 Wzorzec Obserwator Obiekt Pies 8 Obiekt obse r liczba całkowita w owany „usuń mnie z listy subskrybentów” Obiekt k a czka Obiekt K ot Obiekt Mysz Obiekty obserwujące Obiekt Pies Obiekt k a czka Obiekt K ot Obiekty obserwujące 8 Obiekt obse r liczba całkowita w owany Obiekt Mysz 14 liczba całkowita Obiekt obse r wowany 14 14 14 Obiekt Pies Obiekt k a czka Obiekt K ot Obiekt Mysz Obiekty obserwujące jesteś tutaj(cid:1) 77 Obiekt Mysz prosi o usunięcie z listy obserwatorów. Mysz otrzymywała aktualizacje danych z obiektu obserwowanego od wieków — nic dziwnego zatem, że w końcu jej się znudziło i postanowiła zrezygnować z bycia obserwatorem. Myszy już tu nie ma! Obiekt obserwowany potwierdza przyjęcia żądania Myszy i usuwa ją z listy obserwatorów. Obiekt obserwowany ponownie zmienił stan. Wszystkie obiekty obserwujące zostają o tym fakcie powiadomione; wyjątkiem jest tutaj Mysz, która już nie znajduje się na liście subskrybentów. Nie mów tego nikomu, ale tak naprawdę nasza Mysz w skrytości ducha tęskni za bieżącymi komunikatami… być może pewnego dnia wystąpi ona z prośbą o ponowne zaliczenie jej w poczet obserwatorów. rozdzial_02_kor_II.indd 77 rozdzial_02_kor_II.indd 77 2005-06-29 09:49:36 2005-06-29 09:49:36 Pięciominutowe przedstawienie Pięciominutowe przedstawienie — obserwowany kontra obserwujący W dzisiejszym skeczu dwóch zakręconych projektantów oprogramowania spotyka prawdziwego „łowcę talentów”… Mówi Robert. Szukam nowego miejsca pracy w charakterze projektanta systemów opartych na Javie. Mam pięcioletnie doświadczenie oraz… Hmmm, oczywiście, Ty i kto tylko jeszcze będzie chciał, mój chłopcze. Właśnie umieszczam Cię na mojej liście projektantów systemów Java. Nie dzwoń do mnie, to ja do Ciebie oddzwonię! 1 Projektant nr 1 Cześć, mam na imię Joanna, napisałam już wiele systemów wykorzystujących EJB. Jestem zainteresowana dowolnym stanowiskiem pracy w dziale zajmującym się projektowaniem systemów Java. 2 Łowca talentów (Podmiot) Umieszczę Twoje nazwisko na mojej liście. Dzięki temu będziesz informowana na bieżąco, razem z pozostałymi obserwatorami. 3 Projektant nr 2 78 Rozdział 2 4 Obiekt obserwowany (Podmiot) rozdzial_02_kor_II.indd 78 rozdzial_02_kor_II.indd 78 2005-06-29 09:49:36 2005-06-29 09:49:36 5 W międzyczasie życie Roberta i Joanny biegło swoim zwykłym torem; jeżeli pojawiała się jakaś oferta pracy dla projektantów Javy, otrzymywali informacje — krótko mówiąc, zostali obserwatorami. Dzięki! Za chwilę wysyłam swoje CV. Hej, obserwatorzy, właśnie się dowiedziałem, że firma JavaBeans ma kilka wakatów na stanowiskach związanych z projektowania systemów Java — bierzcie się za to! Buehehehe, masz to jak w banku, kochanie! Wzorzec Obserwator Ten facet to jakiś wariat, mam go gdzieś. Sama sobie znajdę pracę. 7 Obserwator Obserwator Arghhh! Zapamiętaj moje słowa, Joasiu, że jeżeli tylko będę mógł uczynić coś w tym kierunku, nigdy więcej nie uda Ci się znaleźć pracy w tym mieście. Skreślam Cię z mojej listy!!! 9 Obiekt obserwowany jesteś tutaj(cid:1) 79 6 Obiekt obserwowany Joanna znajduje nowego pracodawcę. Możesz mnie usunąć ze swojej listy, sama sobie znalazłam pracę! 8 Obserwator rozdzial_02_kor_II.indd 79 rozdzial_02_kor_II.indd 79 2005-06-29 09:49:36 2005-06-29 09:49:36 Definicja wzorca Obserwator Dwa tygodnie później Joanna wielce sobie ceni swoje obecne życie i nie musi już odgrywać roli obserwatora. Jest również bardzo zadowolona, że nowa firma zaproponowała jej bardzo dogodne warunki finansowe, tym lepsze, że nie musiała dodatkowo opłacić usług łowcy talentów. Ale co się stało z naszym drogim Robertem? Słyszeliśmy, że pobił łowcę talentów na jego własnym podwórku. Jest teraz nie tylko obserwatorem, ale również posiada swoją własną listę subskrybentów (obserwatorów), których powiadamia o pojawieniu się nowych ofer
Pobierz darmowy fragment (pdf)

Gdzie kupić całą publikację:

Wzorce projektowe. Rusz głową!
Autor:
, , ,

Opinie na temat publikacji:


Inne popularne pozycje z tej kategorii:


Czytaj również:


Prowadzisz stronę lub blog? Wstaw link do fragmentu tej książki i współpracuj z Cyfroteką: