Wzorzec strukturalny Decorator i wzorzec behawioralny Observer

Transkrypt

Wzorzec strukturalny Decorator i wzorzec behawioralny Observer
Laboratorium
Projektowanie Obiektowe – Wzorce Projektowe
Temat : Wzorzec strukturalny Decorator
i wzorzec behawioralny Observer
Historia zmian
Data
Wersja
Autor
Opis zmian
21.03.2011
1.0
Tomasz Kowalski
Utworzenie dokumentu i wprowadzenie zadania
laboratoryjnego
09.05.2011
1.1
Tomasz Kowalski
Aktualizacja treści, dodanie ilustracji i zadania z gwiazdką
17.05.2011
1.2
Tomasz Kowalski
Drobne poprawki
02.03.2012
1.3
Tomasz Kowalski
Zmiana wzorca
12.05.2012
1.4
Tomasz Kowalski
Poprawa diagramu UML
15.05.2012
1.5
Tomasz Kowalski
Uzupełnienie ilustracji z diagramem UML i aktualizacja
22.05.2013
2.0
Tomasz Kowalski
Aktualizacja w związku z reorganizacją laboratorium
11.06.2013
2.1
Tomasz Kowalski
Doprecyzowanie zadania z wzorcem observer
26.04.2014
2.2
Tomasz Kowalski
Aktualizacja Observera (obowiązkowy!)
1. Cel laboratorium
Głównym celem laboratoriów jest zapoznanie się ze strukturalnym wzorcami projektowymi
Decorator i Observer. Zajęcia powinny pomoc studentom rozpoznawać omawiane wzorce w
projektach informatycznych, samodzielnie implementować wzorce oraz dokonywać odpowiednich
modyfikacji wzorca w zależności od potrzeb projektu.
2. Laboratorium:
Laboratorium jest kontynuacją poprzednich laboratoriów dotyczących wzorców adapter i
command. Rozwiązanie poniższych zadań należy utworzyć w nowych pakietach, których nazwy
będą odpowiadać stosowanym wzorcom projektowym (np. edu.kis.powp.decorator).
Kolejnym pomysłem szefa jest opracowanie rozwiązania dotyczącego kontroli poziomu tuszu w
ploterze. Prace nad rzeczywistym sterownikiem plotera wykazały, że nie będzie możliwe uzyskanie
dostępu do informacji o tuszu bezpośrednio z plotera. Zgodnie z wskazówkami szefa kontrola tuszu
powinna być możliwa zarówno w trybie rzeczywistego użycia plotera jak i podczas symulacji, a
abstrakcje korzystające ze sterowników (klienci sterownika) nie muszą być świadome o
zaimplementowanym mechanizmie.
Szef (bazując na swoich wieloletnich doświadczeniach w projektowaniu systemów) prosi Cię o
opracowanie nowego rozwiązania w oparciu o uproszczony wzorzec decorator (patrz ilustracja 1)
zgodnie z następującymi wytycznymi:
• ilość tuszu powinna być mierzona w jednostkach długości rysowanych linii,
•
na potrzeby symulacji przy braku tuszu ploter powinien przesuwać swoją pozycję nie
rysując do momentu doładowania,
•
szef dodatkowo wspomniał, że mile widziane byłoby powiadomienie ostrzegające o
kończącym się poziomie tuszu.
Ilustracja 1: Diagram UML uproszczonego wzorca decorator i kontroli tuszu.
1. Przed zastosowaniem wzorca decorator zaimplementuj prosty menadżer do kontroli
poziomu tuszu realizujący interfejs IMenadzerTuszu, który będzie zapewniał możliwość:
ładowania, pobierania oraz sprawdzania poziomu tuszu. Klasa ta ma wyłącznie udostępniać
w/w funkcjonalność (np. ładowanie tuszu przez klienta).
2. Wykorzystując wzorzec decorator zaimplementuj sterownik SterownikDecorator (w
hierarchii sterowników), który korzystając z menadżera tuszu będzie realizował
funkcjonalność kontroli ilości tonera w ploterze (bądź w jego symulatorze). *Jaka nazwa tej
klasy będzie bardziej odpowiednia.
3. Zaimplementuj test pokazujący możliwości mechanizmu kontroli tuszu. Wykorzystaj
rozwiązania z poprzedniego laboratorium (tj. polecenia i ich fabryki).
4. Na potrzeby symulacji pakietem Rysownik zmodyfikuj decorator, aby po zakończeniu
tonera narysowane linii nadal były widoczne, ale np. rysując cienką przerywaną linią.
5. *W kontekście projektu wymień i wyjaśnij zalety refaktoryzacji funkcjonalności kontroli
poziomu tuszu do wzorca decorator.
6. *W trosce o większą generyczność opracowanego rozwiązania dokonaj refaktoryzacji do
bardziej złożonej wersji wzorca decorator. Zaimplementuj osłonę do kontroli tuszu oraz
przykładową osłonę o innej wymyślonej przez Ciebie funkcjonalności.
Bazując na ilustracji 2 zaimplementuj przy użyciu wzorca observer mechanizmy opisane w
kolejnych punktach.
7. Zmiany typu linii w przypadku braku lub doładowaniu tuszu w dekorującym sterowniku
(observerem jest sterownik dekorujący).
8. W programie testującym zaimplementuj ostrzeżenie klienta o braku tuszu poprzez (możesz
skorzystać ze swingowej fasady JOptionPane). Powiadomienie może oferować opcję
doładowania tuszu.
Wskazówka: program testowy (tzn. klient) może tworzyć odpowiedniego observera jako
instancję klasy anonimowej (podobnie jak w typowej obsłudze zdarzeń1).
Ilustracja 2: Diagram UML wzorca observer i kontroli tuszu.
1 http://docs.oracle.com/javase/tutorial/java/javaOO/anonymousclasses.html#examples-of-anonymous-classes