Jacek Matulewski
Inżynieria oprogramowania. Zadania z wzorców projektowych

W trakcie zajęć

  1. (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ę.
  2. (Dekorator) W projekcie omawianym na zajęciach klasę abstrakcyjną Napój zmienić na interfejs INapój.
  3. (Pyłek+Fabryka) W projekcie omawianym na zajęciach zmienić fabrykę znaków na singleton.
  4. (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).
  5. (Kompozyt+Odwiedzający) Zdefiniuj odwiedzającego zliczającego liczbę elementów w kompozycie.

W domu - zadania nawiązujące do projektów z zajęć

  1. (Singleton) W projekcie "Rejestrator zdarzeń" zdefiniować modyfikację singletonu, która umożliwia stworzenie wskazanej liczby instancji klasy. Jak przekazać ten parametr?
  2. (Interpreter) Napisać interpreter konwertujący liczby liczby arabskie na rzymskie (podpowiedź: wykorzystać system pozycyjny).
  3. (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.
  4. (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).
  5. (Metoda szablonowa) Zmodyfikować projekt Pizzy w oparciu o delegacje.
  6. (Szyna komunikatów) Wskaż podobieństwa wzorców szyna komunikatów i mediator.
  7. (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.
  8. (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

  1. 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.

  2. 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.
  3. 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.
  4. 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.
  5. 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".
  6. Poprzednie zadanie zrealizuj korzystając ze zdarzenia zdefiniowanego w klasie Spust.
  7. Zajrzyj na stronę https://refactoring.guru/pl/design-patterns/ i naucz się jednego wzorca, który nie był omawiany na zajęciach.
  8. 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
  9. 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.
  10. 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.
  11. 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.
  12. 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.
  13. 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.
  14. 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.