Projektowanie obiektowe oprogramowania Wykład 7 wzorce czynnościowe (2) Wiktor Zychla 2018

Podobne dokumenty
(wybrane) Wzorce projektowe. Programowanie Obiektowe Mateusz Cicheński

(wybrane) Wzorce projektowe. Programowanie Obiektowe Mateusz Cicheński

Przewodnik krok po kroku:

Programowanie obiektowe

Projektowanie Graficznych Interfejsów Użytkownika Robert Szmurło

Projektowanie obiektowe oprogramowania Wykład 4 wzorce projektowe cz.i. wzorce podstawowe i kreacyjne Wiktor Zychla 2015

Zaawansowane programowanie w C++ (PCP)

Zaawansowane programowanie obiektowe - wykład 5

Projektowanie Graficznych Interfejsów Użytkownika. Robert Szmurło

Problemy projektowania obiektowego. Czy podobne problemy można rozwiązywac w podobny sposób?

Projektowanie obiektowe oprogramowania Wykład 5 wzorce strukturalne Wiktor Zychla 2016

Wzorce projektowe cz. I. Wzorce projektowe cz. I 1/33

Wprowadzenie do programowania aplikacji mobilnych

Programowanie obiektowe

Wzorce projektowe. dr inż. Marcin Pietroo

Projektowanie obiektowe. dr Jarosław Skaruz

Wzorce projektowe. Wstęp

Omówienie wzorców wykorzystywanych w Prism 5.0. Dominika Różycka

Programowanie obiektowe i zdarzeniowe wykład 4 Kompozycja, kolekcje, wiązanie danych

Podstawy programowania obiektowego

Projektowanie obiektowe oprogramowania Wykład 4 wzorce projektowe cz.i. wzorce podstawowe i kreacyjne Wiktor Zychla 2017

Analiza i projektowanie obiektowe 2016/2017. Wykład 11: Zaawansowane wzorce projektowe (1)

Projektowanie obiektowe Wzorce projektowe. Gang of Four Wzorce odpowiedzialności

Programowanie obiektowe

Metodyki zwinne wytwarzania oprogramowania

Projektowanie oprogramowania: wzorce architektoniczne i projektowe

Programowanie obiektowe

Programowanie w języku Java WYKŁAD

Technologia Programowania 2016/2017 Wykład 5

Programowanie obiektowe i zdarzeniowe

Środowisko programistyczne GEANT4

problem w określonym kontekście siły istotę jego rozwiązania

Dzisiejszy wykład. Wzorce projektowe. Visitor Client-Server Factory Singleton

Java JMX. Marcin Werla. Monitorowanie i zarządzanie usługami sieciowymi w Javie. mwerla@man.poznan.pl PCSS/Poznań JUG

Wykład 4. Klasa List Kolejki Stosy Słowniki

Projektowanie obiektowe oprogramowania Wzorce architektury aplikacji (3) Wykład 11 Repository, Unit of Work Wiktor Zychla 2016

Wykład 5 Okna MDI i SDI, dziedziczenie

Kurs programowania. Wykład 9. Wojciech Macyna. 28 kwiecień 2016

Programowanie obiektowe

Laboratorium z przedmiotu: Inżynieria Oprogramowania INEK Instrukcja 7

Command (action, transaction, polecenie)

Ekspert radzi. mechanizm w enova, umożliwiający wskazanie domyślnej drukarki dla danego stanowiska i wydruku. Strona 1 z 8. Ekspert radzi.

Wzorce oprogramowania Gof (cd) zastosowane w modelu obiektowym

Dariusz Brzeziński. Politechnika Poznańska, Instytut Informatyki

Wzorce Strukturalne. Adapter: opis. Tomasz Borzyszkowski

UML a kod w C++ i Javie. Przypadki użycia. Diagramy klas. Klasy użytkowników i wykorzystywane funkcje. Związki pomiędzy przypadkami.

Klasy cd. Struktury Interfejsy Wyjątki

Programowanie obiektowe

Projektowanie obiektowe. Roman Simiński Wzorce projektowe Wybrane wzorce strukturalne

Programowanie obiektowe

Kurs programowania. Wykład 2. Wojciech Macyna. 17 marca 2016

Projektowanie obiektowe Wzorce projektowe

Wzorce projektowe ArrayList. Aplikacja i zdarzenia. Paweł Chodkiewicz

Kurs programowania. Wykład 13. Wojciech Macyna. 14 czerwiec 2017

Singleton. Cel: Przykład: Zastosowanie: Zapewnienie, że klasa ma tylko jedną instancję i dostarczenie globalnego dostępu do niej.

KLASA UCZEN Uczen imię, nazwisko, średnia konstruktor konstruktor Ustaw Wyswietl Lepszy Promowany

Enkapsulacja, dziedziczenie, polimorfizm

Obiektowe programowanie rozproszone Java RMI. Krzysztof Banaś Systemy rozproszone 1

Programowanie zorientowane obiektowo. Mateusz Kołecki

Platformy Programistyczne Podstawy języka Java

Technologia Programowania 2016/2017 Wykład 4

Wzorce logiki dziedziny

KLASA UCZEN Uczen imię, nazwisko, średnia konstruktor konstruktor Ustaw Wyswietl Lepszy Promowany

Java: interfejsy i klasy wewnętrzne

Interfejsy. Programowanie obiektowe. Paweł Rogaliński Instytut Informatyki, Automatyki i Robotyki Politechniki Wrocławskiej

Instrukcja 2 Laboratorium z Podstaw Inżynierii Oprogramowania

Poznaj ASP.NET MVC. Kamil Cieślak Microsoft Student Partner

Technologie obiektowe

Programowanie obiektowe

Plan wykładu CORBA. Cechy aplikacji rozproszonych. Aplikacje rozproszone

Języki Programowania. Prowadząca: dr inż. Hanna Zbroszczyk. tel: Konsultacje: piątek:

Aplikacje RMI

Projektowanie obiektowe oprogramowania Wzorce architektury aplikacji (3) Wykład 11 Repository, Unit of Work Wiktor Zychla 2017

Metodyki zwinne wytwarzania oprogramowania

Języki i paradygmaty programowania doc. dr inż. Tadeusz Jeleniewski

Aplikacje RMI Lab4

Logger. Następnie w klasie Bootstrapper muimy zarejestrować nasz nowy logger:

Programowanie w języku Java WYKŁAD

Programowanie obiektowe

Programowanie obiektowe

Programowanie komponentowe 5

TEMAT : KLASY POLIMORFIZM


Wątki. Definiowanie wątków jako klas potomnych Thread. Nadpisanie metody run().

Programowanie Komputerów

Pola i metody statyczne. Klasy zawierające pola i metody statyczne

Przykład zastosowania notacji UML dla realizacji zastosowania wzorca Mediator (materiały dla studentów na prawach rękopisu)

Języki i paradygmaty programowania - 1

Zaawansowane programowanie w języku C++ Funkcje uogólnione - wzorce

Programowanie obiektowe i zdarzeniowe

Klasy abstrakcyjne, interfejsy i polimorfizm

Wypożyczalnia VIDEO. Technologie obiektowe

Klasy abstrakcyjne i interfejsy

Oprogramowanie i wykorzystanie stacji roboczych. Wykład 4

Programowanie w C++ z użyciem kontenerów - parę przykładów programów Opracowanie: dr hab. Mirosław R. Dudek, prof. UZ

Architektura interfejsu użytkownika

Klasy i obiekty cz II

Programowanie obiektowe

Wykład 4 Delegat (delegate), właściwości indeksowane, zdarzenie (event) Zofia Kruczkiewicz

Transkrypt:

Projektowanie obiektowe oprogramowania Wykład 7 wzorce czynnościowe (2) Wiktor Zychla 2018 1 Mediator Motto: Koordynator współpracy ściśle określonej grupy obiektów dzięki niemu one nie odwołują się do siebie wprost (nie muszą nic o sobie wiedzieć), ale przesyłają sobie powiadomienia przez mediatora. Kojarzyć: niby Observer bo też powiadomienia, ale zbiór współpracujących obiektów jest tu ściśle określony. Mediator może więc wykorzystać ten fakt do wyboru różnych technik przesyłania powiadomień (bezpośrednio, na styl observera itp.). Druga różnica między Mediatorem a Observerem jest taka że to kolaborujące obiekty przesyłają sobie powiadomienia o zmianie swojego stanu, a stan Mediatora nie ma nic do tego. W Observerze wszyscy zainteresowani nasłuchują powiadomień o zmianie stanu obiektu obserwowanego. Nie ma więc zupełnie analogii między mediatorem a obserwowanym. Przykład z życia: typowe okienka desktopowych technologii wytwarzania GUI są mediatorami między konkretnymi kontrolami, które są zagregowane wewnątrz (w środku okienka Mediator, pomiędzy okienkami Observer) class Mediator AbstractMediator AbstractColleague ConcreteMediator ConcreteColleague1 ConcreteColleague2 2 Observer Motto: powiadamianie zainteresowanych o zmianie stanu, dzięki czemu nie odwołują się one do siebie wprost.

Kojarzyć: zdarzenia w C# Przykład z życia: architektura aplikacji oparta o powiadomienia między różnymi widokami (w środku okienka Mediator, pomiędzy okienkami Observer) Jeszcze inaczej Observer ujednolica interfejs Colleagues Mediatora, dzięki czemu obsługuje dowolną liczbę Colleagues class Observ er IObservable registers in IObserver + Notify() : void 0..* + RegisterObserver(IObserver) : void + UnregisterObserver(IObserver) : void notifies Observ er + Notify() : void Observ able + RegisterObserver(IObserver) : void + UnregisterObserver(IObserver) : void Komentarz: kolejny wzorzec który silnie wpływa na rozwój języków C#-owe zdarzenia (events) to przykład uczynienia ze wzorca projektowego elementu języka. 3 Event Aggregator Motto: rozwiąż problem Observera ogólniej jeden raz dla różnych typów powiadomień Kojarzyć: ogólniejszy Observer, hub komunikacyjny (Observer zaimplementowany jako słownik list słuchaczy indeksowany typem powiadomienia) Event Aggregator znosi najważniejsze ograniczenie Observera klasy obserwatorów muszą tam zna klasę obserwowanego. W EventAggregatorze zarówno obserwowani jak i obserwujący muszą tylko wiedzieć gdzie szukać EventAggregatora. W efekcie klasy obserwowane i obserwujące mogą być zdefiniowane np. w niezależnych od siebie modułach (co jest niemożliwe w przypadku Observera). Uwaga: jeden z ważniejszych wzorców dobrej architektury aplikacji

class Ev entaggregator Subscriber1 Publisher1 subscribe notify publish Ev entaggregator publish notify Publisher2 subscribe Subscriber2 namespace Uwr.OOP.BehavioralPatterns.EventAggregator public interface ISubscriber<T> void Handle( T Notification ); public interface IEventAggregator void AddSubscriber<T>( ISubscriber<T> Subscriber ); void RemoveSubscriber<T>( ISubscriber<T> Subscriber ); void Publish<T>( T Event ); public class EventAggregator : IEventAggregator Dictionary<Type, List<object>> _subscribers = new Dictionary<Type, List<object>>(); #region IEventAggregator Members public void AddSubscriber<T>( ISubscriber<T> Subscriber ) if (!_subscribers.containskey( typeof( T ) )) _subscribers.add( typeof( T ), new List<object>() ); _subscribers[typeof( T )].Add( Subscriber ); public void RemoveSubscriber<T>( ISubscriber<T> Subscriber ) if (_subscribers.containskey( typeof( T ) )) _subscribers[typeof( T )].Remove( Subscriber );

public void Publish<T>( T Event ) if (_subscribers.containskey( typeof( T ) )) foreach (ISubscriber<T> subscriber in _subscribers[typeof( T )].OfType<ISubscriber<T>>()) subscriber.handle( Event ); #endregion 4 Memento Motto: Zapamiętuj i pozwalaj odzyskać stan obiektu Uwaga: stan obiektu i stan pamiątki nie muszą być takie same. W szczególności duże obiekty mogą tworzyć małe, przyrostowe pamiątki Kojarzyć z: Undo (i opcjonalnym Redo). class Memento - state Originator - state Memento Caretaker + CreateMemento() : Memento + RestoreMemento(Memento) : void + GetState() : void + SetState(string) : void state = memento.getstate(); Memento m = new Memento(); m.setstate( this.state ); return m; W trakcie wykładu zobaczymy jak zbudować obiekt Memento i oddzielić od niego odpowiedzialność typu Caretaker w której umieścimy funkcjonalność Undo/Redo. namespace Uwr.OOP.BehavioralPatterns.Memento public class Caretaker Stack<Memento> undostack = new Stack<Memento>(); Stack<Memento> redostack = new Stack<Memento>(); private Originator originator; public Caretaker( Originator o ) this.originator = o; this.originator.statechanged += OriginatorStateChanged; public void Undo()

if (this.undostack.count > 1) // bieżący stan na redo Memento m = undostack.pop(); redostack.push( m ); Memento ps = undostack.peek(); this.originator.restorememento( ps ); public void Redo() if (this.redostack.count > 0) Memento m = redostack.pop(); undostack.push( m ); this.originator.restorememento( m ); public void OriginatorStateChanged() redostack.clear(); Memento m = this.originator.creatememento(); undostack.push( m ); public class Originator public event Action StateChanged; private string _state; public string State get return _state; set _state = value; if (this.statechanged!= null) this.statechanged(); public Memento CreateMemento() Memento m = new Memento(); m.state = this.state; return m; public void RestoreMemento( Memento m )

this._state = m.state; public class Memento public string State get; set;