Jacek Matulewski
Inżynieria oprogramowania. Zadania z wzorców projektowych
W trakcie zajęć
- (Singleton) Zmodyfikować singleton odpowiedzialny za rejestrację zdarzeń tak, aby możliwe było stworzenie dwóch instancji klasy. Klasy mają być udostępniane na zmianę.
- (Dekorator) W projekcie omawianym na zajęciach klasę abstrakcyjną
Napój
zmienić na interfejs INapój
.
- (Pyłek+Fabryka) W projekcie omawianym na zajęciach zmienić fabrykę znaków na singleton.
- (Metoda szablonowa) Zmodyfikować implementację metody
przygotuj
w oparciu o delegacje (trzeba albo zmodyfikować klasę Pizza
albo dodać klasę potomną przyjmującą referencje typu Action
- wówczas można konfigurować w runtime - DI).
- (Kompozyt+Odwiedzający) Zdefiniuj odwiedzającego zliczającego liczbę elementów w kompozycie.
W domu - zadania nawiązujące do projektów z zajęć
- (Singleton) W projekcie "Rejestrator zdarzeń" zdefiniować modyfikację singletonu, która umożliwia stworzenie wskazanej liczby instancji klasy. Jak przekazać ten parametr?
- (Interpreter) Napisać interpreter konwertujący liczby liczby arabskie na rzymskie (podpowiedź: wykorzystać system pozycyjny).
- (Polecenie->Most) W projekcie "Pilot do telewizora i radia" zbierać wywołania metod z pilota do urządzenia RTV w paczki i wywoływać je co minutę. Wywołania przechowywać w poleceniach.
- (Kompozyt+Odwiedzający) Napisz klasę odwiedzającego/gościa, która zlicza liczbę węzłów i krawędzi w grafie kompozytu (drzewo). Liczba węzłów to po prostu liczba wywołań metody Odwiedź, ale liczenie krawędzi będzie wymagać poważniejszych zmian w kodzie (np. przesłanie rodzica aktualnego obiektu i być może przechowywanie referencji do odwiedzonych elementów).
- (Metoda szablonowa) Zmodyfikować projekt Pizzy w oparciu o delegacje.
- (Szyna komunikatów) Wskaż podobieństwa wzorców szyna komunikatów i mediator.
- (Strategia) W projekcie zgadywanie liczb zmienione są warunki zadania. Po każdej próbie uzyskujemy informację o tym, czy zgadywana liczba jest mniejsza, czy większa od podanej w próbie. Dodatkowo wypróbuj metodę bisekcji jako strategię znajdywania.
- (Pełnomocnik/Most, Polecenie) Wrócić do projektu dotyczącego wzorców pełnomocnik i most i zaimplementować zbieranie wywołań w paczki po 5 czynności lub wykonywać je co minutę. Należy wykorzystać wzorzec polecenie lub delegacje.
W domu - zadania do samodzielnego wykonania
- Zmodyfikuj grę Breakout tak, żeby na planszy znajdowały się dwie piłki zbijające cegły. Paletka pozostaje jedna.
Projekt wymaga Visual Studio 2017 lub nowszego. GUI przygotowane zostało w WPF.
Należy wybrać jeden z wariantów projektu A lub B (linki dostępne na stronie głównej). Zapisz czas, jaki zajęło Ci wykonania zadania.
- Korzystając ze wzorca singleton przygotuj klasę, która implementuje globalny licznik posiadający metodę
Inkrementuj
zwiększającą wartość licznika o jeden i własność Wartość
, która pozwala odczytać bieżącą warość licznika. Można również dodać metodę Resetuj
ustawiającą licznik na zero.
- Korzystając ze wzorca dekorator przygotuj zestaw klas opisujących choinkę, do której można dodać lampki, łańcuchy, anielskie włosy, różnego rodzaju bombki, itd. Wersje podstawowe to świetk i jodła kaukaska. W ramach testów przygotuj choinkę z dwoma łańcuchami, zielonymi bombkami i lampkami.
- Napisz klasę fabryki generującej lody (obiekty implementujące interfejs
ILody
). Można wybrać smak waniliowy lub czekoladowy - powstaną odpowiednio nowe instancje klas LodyWaniliowe
i LodyCzekoladowe
. Typ wskazywany jest za pomocą typu wyliczeniowego SmakiLodów
.
- Napisz klasy
Flinta
i Spust
, które pełnią rolę obserwatora i obserwabli. Wywołanie metody Spust.Pociągnij
, której towarzysy wyświetlenie napisu "Pif" w konsoli, powinno wywołać metodę Flinta.Wystrzał
, która powoduje pokazanie napisu "Paf".
- Poprzednie zadanie zrealizuj korzystając ze zdarzenia zdefiniowanego w klasie
Spust
.
- Zajrzyj na stronę https://refactoring.guru/pl/design-patterns/ i naucz się jednego wzorca, który nie był omawiany na zajęciach.
- Korzystając ze wzorca most przygotuj implementację figur płaskich, w których rozdzielone są kształty figur od ich koloru. Klasa abstrakcyjna
Figura
zawiera pole typu abstrakcyjnej klasy Kolor
. Figura ma klasy potomne Prostokąt
i Okrąg
, a klasa Kolor
ma klasy potomne Czerwony
, Niebieski
i Zielony
. Por. https://refactoring.guru/pl/design-patterns/bridge
- Napisz ogólną implementację wzorca kompozyt, w której liście mogą przechowywać dowolne dane typu wskazanego w parametrze (typ ogólny). Zdefiniuj metody pozwalające na odczytanie, zmianę, dodanie i usunięcie elementu z kolekcji.
- Korzystając wyłącznie z enumeratora udostępnianego przez interfejs
IEnumerable<T>
przygotowuj metodę odpowiadającą pętli for
, w której można wskazać indeks początkowy i końcowy oraz krok. Metoda powinna umożliwiać przesłanie przez argument metody wykonywanej dla wybranych indeksami elementów kolekcji. Dodatkowo możesz spróbować zrównoleglić działanie tej metody korzystając z TPL.
- W aplikacji konsolowej zdefiniuj klasę polecenia z metodą wyświetlającą w konsoli pojedynczy znak typu
char
. Znak przechowywany jest w polu tej klasy. Aplikacja powinna tworzyć instancje polecenia po każdym naciśnięciu klawisza (niezbędna będzie pętla blokująca zakończenie aplikacji). Po naciśnięciu klawisza Enter pętla kończy się, a wszystkie polecenia są uruchamiane w kolejności od ostatniego do pierwszego.
- W aplikacji konsolowej po każdym naciśnięciu klawisza generuj liczbę pseudolosową, ale zapisuj je do osobnych plików do 1 sekundę. Do implementacji wykorzystaj wzorzec polecenie.
- Zdefiniuj klasę
Węzeł
, która ma metodę Powiadom
i zdarzenie Zmienione
. Metoda powinna pasować sygnaturą do zdarzenia. Połącz instancje tej klasy w łańcuch 10 obiektów, w których drugi nasłuchuje zdarzenia pierwszego (tj. metoda drugiego jest dodana do kolekcji zdarzenia pierwszego) itd. W ostatnim obiekcie łańcucha zasubskrybuj zdarzenie z metodą wyświetlającą w konsoli jakiś komunikat. Następnie wywołaj metodę Powiadom
pierwszego obiektu i sprawdź, czy zgłaszane jest zdarzenie ostatniego.
- Korzystając ze wzorca metoda szablonowa opisz proces pieczenia ciasta składający się z trzech etapów: 1) przygotowanie ciasta, 2) pieczenie, 3) dekorowanie. Powinien być możliwy wybór ciasta waniliowego i czekoladowego, możliwość wskazania dowolnego czasu pieczenia oraz trzy różne zestawy dodatków. Przygotuj klasy reprezentujące dwa możliwe warianty ciasta.