Wzorce projektowe

Zalążek strony, materiały będą się pojawiały sukcesywnie.

  • SOLID, KISS, DRY… — wprowadzenie do zasad tworzenia solidnego oprogramowania, część pierwsza.
  • Proste wzorce projektowe — fasada, adapter obiektowy i klasowy, implementacje: C++, C#, Java (pdf).
  • Proste wzorce projektowe — kompozyt, implementacje: Java (pdf).
  • Proste wzorce projektowe — dekorator, implementacje: Java (pdf). Tutaj można zobaczyć proste demo (Java) wykorzystujące koncepcję dekoratora, rozwiązujące jedno z zadań podanych poniżej.
  • Proste wzorce projektowe — prosta fabryka, implementacje: Java (pdf).
  • Proste wzorce projektowe — obserwator, implementacje: Java (pdf).
  • Proste wzorce projektowe — strategia, implementacje: Java (pdf).

Ćwiczenia

  1. W standardowej bibliotece języka C (identyfikowanej plikiem nagłówkowym stdio.h) występują funkcje do obsługi plików. Proszę zdefiniować klasę BinaryFile, stanowiącą obiektową fasadę dla wybranych funkcji obsługujących pliku na poziomie stdio.h. Specyfikacja zewnętrzna klasy BinaryFile dostępna jest tutaj. Należy zdefiniować odpowiednie funkcje składowe, dodać ewentualne pola prywatne lub chronione, napisać program testujący zrealizowaną implementację. W fasadzie wykorzystywany ma być typ FILE, oraz funkcje biblioteczne: fopen, fclose, ftell, fseek, itd…
  2. Stąd można pobrać plik CPP zawierający przykładową realizację operacji konsolowych w środowisku Windows. Jest to implementacja funkcyjna bazująca na funkcjach WinAPI. Kod powinien się kompilować w środowiska Borland/Embarcaderro oraz MinGW. Proszę napisać obiektową fasadę dla tych funkcji, ma ona mieć formę modułu, należy zdefiniować odpowiedni plik nagłówkowy i implementacyjny oraz zdefiniować projekt pozwalający na przetestowania fasady.
  3. W bibliotekach języka Java dostępne są różne klasy pozwalające na obsługę plików. W pewnym systemie informatycznym potrzebna jest klasa obsługująca zapis bądź odczyt danych do/z plików tekstowych. Wymagania odnośnie tej klasy, o nazwie TextFile, zostały sztywno określone. Klasy dostępne w bibliotekach języka Java bezpośrednio nie odpowiadają tym wymaganiom. Proszę zdefiniować klasę TextFile, stanowiącą adapter dla wybranej klasy obsługi plików tekstowych. Proszę przeanalizować umieszczony tutaj opis klasy TextFile i zaadaptować najlepiej pasującą klasę z bibliotek języka Java. Proszę przygotować dwie implementacje: jako adapter obiektowy i klasowy. W trakcie realizacji proszę dostosować się do specyfiki obsługi błędów wejścia-wyjścia wykorzystywanej z języku Java.
  4. Z punktu widzenia systemu plików systemu operacyjnego, zapis dotyczący samego pliku jak i folderu (katalogu) jest dość podobny. Plik oraz katalog mają swoją nazwę, przy listowaniu zawartości dysku takie nazwy są wypisywane, niezależnie od tego, czy mamy doczynienia z plikiem czy folderem, przy czym nazwy folderów są w pewien sposób wyróżniane (proszę sprawdzić zlecenia listowania zawartości dysku/folderów w swoim ulubionym systemie operacyjnym). Foldery mogą zawierać w sobie pliki i/lub podfoldery. W analogiczny sposób można potraktować dysk, który ma swój literowy identyfikator oraz nazwę. Proszę zidentyfikować prosty wzorzec projektowy pozwalający na opisanie powyższych zależności oraz, z wykorzystaniem tego wzorca, napisać program pozwalający na:
    • Założenie hipotetycznego systemu plików, struktura może być zdefiniowana sztywno w programie (zapisana w kodzie). Proszę programowo zbudować przykładową strukturę.
    • Symulowanie „linii poleceń” — program ma pozwalać użytkownikowi na sprowadzanie poleceń typu dir, cd .., cd <nazwa podkatalogu>. A zatem użytkownik może poruszać się po zdefiniowanej strukturze dysku, mając możliwość przeglądania zawartości odwiedzanych katalogów. Zakładamy, że na starcie katalogiem domyślnym jest główny katalog symulowanego systemu plików.
  5. Książka składa się z rozdziałów. Książka ma swój tytuł. Każdy rozdział może być podzielony na podrozdziały. Każdy podrozdział może być również dzielony na kolejne podrozdziały. Każdy rozdział/podrozdział ma swój tytuł. Ostatecznie dochodzimy do rozdziałów/podrozdziałów zawierających w sobie tylko tekst składający się akapitów (paragrafów). Proszę zidentyfikować prosty wzorzec projektowy pozwalający na opisanie powyższych zależności. Nie musi on uwzględniać akapitów i ich zawartości. Przy użyciu tego wzorca proszę napisać program pozwalający na:

    • Założenie struktury hipotetycznego dokumentu, struktura może być zdefiniowana sztywno w programie (zapisana w kodzie). Proszę programowo zbudować przykładową strukturę.
    • Wygenerowanie spisu treści, w którym rozdziały każdego z poziomów zostaną automatycznie ponumerowane, a ich tytuły zostaną umieszczone w spisie z odpowiednim wcięciem. Przykład — numery i poziom wcięć dobierane automatycznie, tytuły wg definicji zawartych w kodzie:
      Książka
      1. Rozdział pierwszy
      2. Rozdział drugi
        2.1 Pierwszy podrozdział
          2.1.1 Kolejny podrozdział
          2.1.2 Jeszcze jeden podrozdział
        2.2 Drugi podrozdział
      3. Zakończenie
      
  6. W języku HTML każdy fragment tekstu może być na różne sposoby „otagowany”, czyli otoczony odpowiednimi znacznikami. Załóżmy, że mamy klasę PlainText przechowującą fragment tekstu. Klasa ta posiada funkcję składową void write(), która wypisuje do strumienia wyjściowego programu tekst zapisany w obiekcie tej klasy. Obiekt klasy PlainText może być „otagowany” znacznikami <p>, <strong>, <em>, <mark>. Każdy dozwolony w HTML układ „otagowania” tekstu tymi znacznikami jest możliwy. „Otagowany” tekst ma być wyprowadzany do strumienia wyjściowego funkcją składową posiada funkcję składową void write(). Proszę zidentyfikować prosty wzorzec projektowy pozwalający na wyprowadzenie do strumienia wyjściowego „otagowanego” w dowolny sposób tekstu obiektu klasy PlainText. Bazując na zidentyfikowanym wzorcu proszę napisać program (może być konsola), który:
    • Pozwoli użytkownikowi na wprowadzenie jednolinijkowego tekstu.
    • Pozwoli na wybranie jakimi znacznikami ma być „otagowany” wprowadzony tekst (znaczniki wskazane wyżej), dozwolona jest dowolna kombinacja znaczników.
    • Wyprowadzi do strumienia wyjściowego odpowiednio „otagowany” tekst HTML.
  7. Jak opisano w zadaniu poprzednim, w języku HTML każdy fragment tekstu może być na różne sposoby „otagowany”. Proszę napisać prosty program (może być konsola), który:
    • Pozwoli użytkownikowi na wprowadzenie jednolinijkowego tekstu.
    • Wyświetli proste menu zawierające wybrane znaczniki HTML (np. strong, p, em, mark), menu ma pozwolić użytkownikowi na jednokrotny wybór znacznika jakim ma być otoczony wcześniej wprowadzony tekst.
    • Wyprowadzi do strumienia wyjściowego tekst otoczony wybranym w menu znacznikiem.

    Program ma zostać zaimplementowany z wykorzystaniem wzorca Prosta Fabryka lub Metod Fabrykująca.

  8. Załóżmy, że istnieje klasa CzujnikTemperatury, posiadająca prywatne pole temperatura, przechowujące zarejestrowaną wartość temperatury zapisaną w stopniach Celsiusza. Załóżmy również, że klasa posiada metodę ustaw(nowaWartość) pozwalającą na zmianę wartości temperatury. Wartość temperatury pokazują trzy programowe wyświetlacze, reagując na każdą zmianę temperatury spowodowaną wywołaniem metody ustaw obiektu klasy CzujnikTemperatury. Każdy z wyświetlaczy pokazuje temperaturę w innej skali temperatur: Celsiusza, Kelvina i Fahrenheit’a. Proszę zidentyfikować jaki wzorzec projektowy dobrze opisuje przedstawioną sytuację oraz napisać prosty program demonstracyjny implementujący zidentyfikowany wzorzec.
  9. Tablice można sortować różnymi metodami. W bibliotekach większości języków zaimplementowane są szybkie algorytmy sortowania. Jakie są jednak rzeczywiste różnice pomiędzy tzw. prostymi algorytmami sortowania a np. algorytmem sortowania szybkiego? Proszę napisać program, który pozwoli na przeprowadzenie zautomatyzowanych eksperymentów pozwalających sprawdzić efektywność sortowania. Program przeprowadzić automatyczne testy, polegające na utworzeniu tablicy, zapełnieniu jej losowymi danymi, oraz posortowaniu jej różnymi metodami (pomiar czasu). Proszę utworzyć tablice o: kilkudziesięciu elementach, kilkuset elementach, kilku tysiącach elementów (może uda się dla większego rozmiaru). Sortowanie każdą metodą mam być powtórzone 10 razy a wyniku uśrednione. Proszę przetestować dwie proste metody sortowania (np. bąbelkowe, proste wybieranie), sortowanie szybkie oraz sortowanie dostępne w bibliotekach wybranego języka. Uwaga: program jest prosty, wiem, że mało ciekawy. Ale on ma być poligonem doświadczalnym dla przećwiczenia stosowania wzorców projektowych. Proszę uważnie przemyśleć jakie można zastosowań w tym programie wzorce projektowe, oraz sporządzić prostą, np. konsolową implementację programu wraz z komentarzami wskazującymi jakie wzorce, co czego, i w których miejscach zostały zastosowane.

Materiały do przedmiotu NJPO II

  1. Java — wprowadzenie do wielowątkowości, (pdf).
  2. Java — krótko o synchronizacji wątków, (pdf).

Warto zajrzeć:

Ćwiczenia

  1. Proszę napisać aplikację wypisującą do strumienia wyjściowego programu wiersze zawierające tablicę wartości silni (zobacz wzór).. Proszę dobrać zakres wyprowadzanych wartości tak, aby obliczenia nie doprowadziły do przepełnienia wartości typu long. Proszę zrealizować dwie wersje:
    • jednowątkową,
    • wielowątkową, wykorzystującą osobne wątki dla obliczenia każdej z wartości silni.

    Proszę dokonać pomiaru czasu wyznaczania kompletnej tablicy w wersji jedno i wielowątkowej.

  2. Proszę napisać krótką, wielowątkową symulację następującego scenariusza. Klasa Producent tworzy Produkt o pewnej Nazwie i zapisuje go do bufora: np. pojemnika typu ArrayList. Każdy produkt dedykowany jest dla konkretnego Klienta. Klienci mają swoje unikatowe identyfikatory, będące kolejnymi liczbami całkowitymi (0, 1, 2 … N). Produkt oprócz nazwy zapamiętuje identyfikator klienta dla którego został zrobiony. Producent zna liczbę klientów, otrzymuje ją poprzez konstruktor. Producent działa jako wątek, tworzy Produkt dla losowo określonego Klienta, zapisuje Produkt do bufora, wysyła powiadomienie i usypia się na pewien losowy czas. Klienci oczekują na powiadomienie Producenta, przeglądają bufor produktów i usuwają z niego produkt o identyfikatorze zgodnym z identyfikatorem Klienta. Proszę wykorzystać słowo kluczowe synchronized, metody sleep, wait, notyfy/notifyAll. Wyprodukowanie każdego Produktu przez Producenta zmniejsza pulę jego zasobów (np. określoną liczbą), po ich wyczerpaniu program ma zostać zakończony.