Pobieranie prezentacji. Proszę czekać

Pobieranie prezentacji. Proszę czekać

Wzorce projektowe Jacek Matulewski

Podobne prezentacje


Prezentacja na temat: "Wzorce projektowe Jacek Matulewski"— Zapis prezentacji:

1 Wzorce projektowe Jacek Matulewski e-mail: jacek@phys.uni.torun.pl
WWW:

2 Główne źródło Głównym materiałem źródłowym jest książka tzw. gangu czworga pt. „Wzorce projektowe”.

3 Przykładowy projekt: „Labirynt”
Aplikacja konsolowa zaprojektowana zgodnie ze wzorcem architektonicznym MVC, czyli Model-View-Controler Model – dane i logika labiryntu Widok – moduł rysujący labirynt w konsoli Kontroler – przyjmuje wejście z klawiatury, modyfikuje model Model Widok Kontroler aktualizuje modyfikuje Użytkownik używa jest oglądany

4 Architektura MVC Kontrola oraz przepływ informacji między modułami aplikacji w architekturze MVC Model Widok Kontroler aktualizuje modyfikuje Użytkownik używa jest oglądany

5 Architektura MVC Jest wiele wersji samego MVC (+ MVP)
My zaimplementujemy wersję z pasywnymi modelem i widokiem (passive) oraz nadzorującym kontrolerem (supervising) lepiej pasujący do konsoli (bez zdarzeń) Kontrolera zredukujemy do funkcji main Model Widok Kontroler aktualizuje modyfikuje Użytkownik używa jest oglądany

6 Przykładowy projekt: „Labirynt”

7 Model (klasa Labirynt)
Pasywny model przechowujący stan aplikacji VC++: Solution Explorer, View Class Diagram

8 Model (klasa Labirynt)
Klasy modelu class MiejsceWLabiryncie { public: virtual RezultatPróbyWejścia SpróbujWejść() = 0; virtual int Wejdź(int indeksBieżącejKomórki) { return -1; } virtual bool Otwórz() { return false; } }; class Komórka : public MiejsceWLabiryncie { ... enum RezultatPróbyWejścia { Nieokreślony = 0, Powodzenie, NieMożnaWejść, Zamknięte }; enum Kierunek { Północ = 0, Południe = 1, Wschód = 2, Zachód = 3 }; enum StanGry { Niezakończona = 0, Śmierć, Wygrana };

9 Model (klasa Labirynt)
Klasy modelu class Komórka : public MiejsceWLabiryncie { private: int indeks; MiejsceWLabiryncie* sąsiednieMiejsca[4]; public: Komórka(int indeks); MiejsceWLabiryncie* PobierzMiejscePoStronie(Kierunek kierunek) const; void PowiążZMiejscem(Kierunek kierunek, MiejsceWLabiryncie* miejsce); virtual RezultatPróbyWejścia SpróbujWejść(); virtual int Wejdź(int indeksBieżącejKomórki); int PobierzIndeks(); bool OtwórzDrzwi(Kierunek kierunek); bool OtwórzDrzwi(); };

10 Model (klasa Labirynt)
Klasy modelu class Labirynt { private: int liczbaKomórek; PKomórka* komórki; int indeksBieżącejKomórki, indeksCelu; StanGry stanGry = Niezakończona; public: Labirynt(int liczbaKomórek, int indeksPoczątkowejKomórki, int indeksCelu); ~Labirynt(); void DodajKomórkę(int indeks, Komórka* komórka); Komórka* PobierzBieżącąKomórkę(); RezultatPróbyWejścia PrzejdźWKierunku(Kierunek kierunek); void Zakończ(); StanGry PobierzStanGry(); };

11 Widok (klasa Widok) Klasa widoku (zbiór funkcji bez własnego stanu)
#pragma once #include "Model.h" class Widok { private: Labirynt* model; public: Widok(Labirynt* model); static void WyświetlInformacjęOKomórce(Komórka* komórka); void WyświetlInformacjęOBieżącejKomórce() const; static void WyświetlInformacjęOPróbiePrzejściaWKierunku(Kierunek kierunek); void WyświetlInformacjęORezultaciePróbyPrzejścia(RezultatPróbyWejścia) const; void WyświetlInformacjęOPróbieOtwarciaDrzwi() const; void WyświetlInformacjęORezultaciePróbyOtwarciaDrzwi(bool wynik) const; void WyświetlInformacjęOStanieGry() const; };

12 Kontroler (funkcja main)
#pragma once #include "Model.h" #include "Widok.h" class Kontroler { protected: Labirynt* model; Widok* widok; void SpróbujPrzejść(Kierunek kierunek); void SpróbujOtworzyćDrzwi(); public: Kontroler(void); ~Kontroler(void); void Uruchom(); };

13 Funkcja main Funkcja main widzi tylko kontroler. Kontroler tworzy instancje modelu i widoku: #include "Kontroler.h" int main(int argc, char* argv[]) { Kontroler kontroler; kontroler.Uruchom(); return 0; }

14 Przykładowy projekt: „Labirynt”
Piszemy kod…

15 Przykładowy projekt: „Labirynt”
Zadania domowe / dwa konkursy (1-3, 4): Do widoku dodać funkcję rysującą bieżącą komórkę (ściany za pomocą znaków *) Przygotować alternatywny widok pokazujący całą mapę z bieżącą komórką oznaczoną # Przygotować zestaw testów jednostkowych dla modelu i widoku (100% pokrycia) Przygotować alternatywny widok korzystający z OpenGL (konkurs)

16 Wzorce konstrukcyjne Wzorce pozwalające oddzielić proces tworzenia instancji obiektów od jego definicji: Budowniczy (Builder) Fabryka abstrakcyjna (Abstract Factory) Metoda wytwórcza (Factory Method) Prototyp (Prototype) Singleton (Singleton)

17 Budowniczy (Builder) Założenia: Model posiada klasę organizującą (Labirynt) oraz kilka klas dodatkowych (Komórka, Ściana, itd.) Cel: 1. Wydzielenie kodu służącego do budowy złożonego produktu (u nas obiektu modelu) z jego klasy 2. Przesłonięcie szczegółów implementacji modelu (tzw. reprezentacji wewnętrznej). 3. Korzystanie z różnych budowniczych prowadzi do tworzenia różnych produktów bez zmiany kodu funkcji tworzącej i zasadniczej struktury produktu

18 Budowniczy (Builder) Implementacja: Do modelu dodana zostaje klasa służąca tylko do stopniowego budowania złożonej instancji głównej klasy modelu. Po zmianach ważne będą już tylko dwie klasy modelu: Labirynt i BudowniczyLabiryntu Nazwy używane w kontekście tego wzorca: Kontroler – Director, kierownik BudowniczyLabiryntu – Builder, budowniczy StdBudowniczyLabiryntu – Concrete Builder Labirynt – Product, produkt

19 Budowniczy (Builder)

20 Budowniczy (Builder)

21 Budowniczy (Builder) Zadania domowe i konkursy:
Przygotować budowniczego labiryntu, który zamiast tworzyć labirynt jedynie liczy komórki i drzwi, a na końcu wyświetla uzyskane liczby. W C++ nie można ukryć klas tworzących tzw. wewnętrzną reprezentację, ale można zablokować ich użycie inaczej niż poprzez budowniczego. Zrób to (konkurs). W hołdzie Pratchettowi przygotować budowniczego dla labiryntu złożonego z foremnych trójkątów na zamkniętym pasie. Użyć PBC w jednym kierunku (konkurs).

22 Metoda wytwórcza (Factory method)
Założenia: W odróżnieniu od budowniczego chcemy zmieniać nie zawartość złożonego produktu, a móc wybierać między różnymi klasami produktu Cel: 1. Interfejs do tworzenia różnych produktów (ale bez tworzenia nowej klasy wytwórcy) 2. Możliwość rozszerzania o nowe typy produktów 3. Stworzenie wiele „wirtualnych konstruktorów” dla szczegółowych klas modelu

23 Metoda wytwórcza (Factory method)
Implementacja: W klasie kontrolującej aplikację (u nas w kontrolerze) stworzymy metody tworzące elementy labiryntu i sam labirynt. Klasa zawierająca metody – Wytwórca. Można tworzyć klasy potomne Wytwórcy/Kontrolera zmieniając zasady gry i modyfikując elementy labiryntu Nazwy używane w kontekście tego wzorca: Kontroler – Creator, wytwórca StandardowyKontroler – Concrete creator Labirynt - Product StandardowyLabirynt – Concrete product

24 Metoda wytwórcza (Factory method)

25 Fabryka abstrakcyjna (Abstract factory)
Założenia: W odróżnieniu od budowniczego chcemy zmieniać nie zawartość złożonego produktu, a móc wybierać między różnymi klasami produktu Cel: 1. Zebranie metod wytwórczych dla rodziny produktu w jednej klasie (często singletonie) 2. Stworzenie interfejsu do tworzenia obiektów (fabryka abstrakcyjna) z możliwością jej nadpisywania w fabryce konkretnej

26 Fabryka abstrakcyjna (Abstract factory)
Implementacja: Tworzymy nową klasę zawierającą zbiór metod wytwórczych tworzących poszczególne elementy labiryntu Nazwy używane w kontekście tego wzorca: FabrykaLabiryntu – Abstract factory StandardowaFabrykaLabiryntu – Concrete factory, fabryka konkretna Labirynt – Abstract product StandardowyLabirynt – Concrete product Kontroler – Client

27 Fabryka abstrakcyjna (Abstract factory)

28 Rozkład MVC na proste wzorce
Zob. pl wiki Model Widok Kontroler aktualizuje modyfikuje Użytkownik używa jest oglądany


Pobierz ppt "Wzorce projektowe Jacek Matulewski"

Podobne prezentacje


Reklamy Google