Szoftvertechnolgia s Grafikus Felhasznli Fellet Tervezse Behavioral tervezsi
Szoftvertechnológia és Grafikus Felhasználói Felület Tervezése Behavioral tervezési minták Iterator, Chain of Responsibility Visitor Observer, Command, Mediator http: //users. nik. uni-obuda. hu/prog 4/ 1
Purpose Design pattern Short description Behavioral Iterator foreach () { } Chain of resp. Több műveletvégző segítségével egy művelet végrehajtása Visitor Végrehajtó és tárgy szétválasztása – több látogató/látogatott: IVisitor. Visit(IVisitor. Acceptor) IVisitor. Accept(IVisitor) Command Végrehajtási kérés/utasítás objektumba ágyazása Observer Hívó és hívott szétválasztása (események segítségével ) Mediator Hívó és hívott teljes szétválasztása (központi vezérlővel) State Státusz osztályok, amik a státuszváltozásokat vezérlik Interpreter Tetszőleges bemenet tetszőleges kimenetté konvertálása Memento Előző tartalom visszaállítása Strategy Teljes implementáció/módszer a leszármazottakban Absztrakt ősosztálytól függés a konstruktorban Dependency injection (via Abstract) Template method Egyes lépések definiálása a leszármazottakban Virtuális metódusok , Metódus polimorfizmus 2
Behavioral Design Patterns Purpose Scope Creational Structural Behavioral Class Factory method Adapter Interpreter Template method Object Abstract factory Builder Prototype Singleton Adapter Bridge Composite Decorator Facade Flyweight Proxy Chain of responsibility Command Iterator Mediator Memento Observer State Strategy Visitor 3
Iterator 4
Iterator • Fő célok – Kívülről ne látszódjon a belső felépítés – Kívülről ne látszódjanak a belső extra típusok – Bármilyen gyűjteményt azonos módon tudjunk bejárni • Tipikus példája annak a tervezési mintának, amely szinte mindegyik nyelvben már megoldott egyszerű nyelvi elemként – C#: IEnumerable + IEnumerable<> + yield return – Java: Iterable – C++: range-based-for + iterator – PHP: Traversable / Iterable 5
Iterator – C# 6
Linq Iterator • System. Linq. Enumerable+Where. Select. Enumerable. Iterator`2 [System. Xml. Linq. XElement, System. String] 7
Iterator – C# – yield return 8
Iterator – C# – Dot. Peek 9
10
Chain of Responsibility 11
Chain of Responsibility • Hasonló elv, mint az Iterator esetén, DE – Adat helyett feldolgozás megy végig – A választ adó folyamat és a lánc teljesen rejtett! – Kívülről ne látszódjon, hogy hány feldolgozó/döntő egység létezik, ne látszódjon a konkrét feldolgozó/döntési útvonal – Kívülről csak az látszódik: megkérem a legfelső/legkülső elemet, hogy hozzon döntést/végezzen el valamit kapok egy választ • Tipikus felhasználás: nagy switch-ek átalakítása foreach-szerű struktúrává, a konkrét ágak ismerete nélkül – Átalakítást végző switch-ek (univerzális converter) – Létrehozást végző switch-ek (factory!!!) – Döntést hozó switch-ek (univerzális validator) • Alapvető variációk – Feltétlen továbbpasszolás: logger chain, feldolgozás, Git. Stats 2 – Feltételes továbbpasszolás: factory chain 12
Chain of Responsibility – C# 13
Chain of Responsibility, types 14
Chain of Responsibility, leszármazott / tag 15
Chain of Responsibility, SOHA NE ÍGY! • Tegyük fel: új leszármazott, ami a YES/NO/DONTKNOW mellett MAYBE választ is ad… – Szerkeszteni kell az enum-ot CODE SMELL – Szerkeszteni kell az ősosztályt CODE SMELL 16
Visitor • Hívó/hívott szétválasztást megvalósító tervezési minta, ami gyűjteményekkel is működhet 17
Visitor • A visitor végzi a műveletet acceptoron, de az acceptor dönti el, hogy vele most épp lehet –e dolgozni • A híváskor nem feltétlenül tudjuk, mi a meghívott művelet • Az Acceptor nem tud a Visitorról, a Visitor tud(hat) az Acceptorról 18
Visitor – C# 19
Visitor – C# – Concrete. Acceptors 20
Visitor – C# – Concrete. Visitors 21
Visitor – C# – Client 22
Behavioral Design Patterns Purpose Scope Creational Structural Behavioral Class Factory method Adapter Interpreter Template method Object Abstract factory Builder Prototype Singleton Adapter Bridge Composite Decorator Facade Flyweight Proxy Chain of responsibility Command Iterator Mediator Memento Observer State Strategy Visitor 23
Observer • Cél: eseménykezelés • A javasolt megvalósítás: „elavult”? 24
Observer 25
Observer – C# 26
Observer – C# 27
Observer – C#, ahogy szoktuk… • A Delegate sokkal jobban megoldja ugyanezt a problémát – Nem kell az egész feliratkozóra referencia, csak egy BÁRMILYEN eseménykezelő metódushoz biztonságosabb, flexibilisebb – Egy adattípus és az operátorai a feliratkozás, leiratkozás, meghívás feladatokra egyszerűbb • C# specifikus extrák – Leiratkozni: KÖTELEZŐ, ha a feliratkozó élettartama a rövidebb (Normális IDisposable, máskülönben: MEMORY LEAK!!!) – Weak Delegates (esetleg a decorator design pattern): https: //www. codeproject. com/Articles/16182/Observable-property-pattern-memory-leaks-and-weak 28
2 9 . NET memory leak ellen: Weak Delegates
IObserver – NEM a pattern, annál több! • Az interfészek nagyon hasonlóak, de egy nagyobb keretrendszer részei • IEnumerable + extensions = LINQ ; IObservable + extensions = RX 30
Reactive Extensions • „Using Rx, developers represent asynchronous data streams with Observables , query asynchronous data streams using LINQ operators , and parameterize the concurrency in the asynchronous data streams using Schedulers. Simply put, Rx = Observables + LINQ + Schedulers. ” • MAY/2018: „everyone agreed upon almost instantaneously was that reactive programming on dotnet needed to have a stronger branding/marketing […] System. Reactive is part of. NET” https: //reactiveui. net/blog/2018/05/system-reactive-has-a-new-home-on-github • https: //github. com/petroemil/Rx. Book (Petró Emil) • Some. Observable. Event. Source. Throttle(Time. Span. From. Milliseconds(100 )). Distinct. Until. Changed (). Timeout(Time. Span. From. Milliseconds(250 )). Retry(3); 31
Command • Az Observer pattern azon hiányosságát próbálja kompenzálni, hogy az egész feliratkozó referenciára szükség van • A Command mintánál a metódushívást „becsomagoljuk” egy command példányba, és a hívó csak ennyit lát: Command. Instance. Execute(); // A hívottból semmit! • A meghívás közben extra művelet is elvégzhető 32
Command – C# • abstract class Command <TReceiver , TParameter , TResult > • WPF ICommand: void Execute( object parameter) 33
Command – C# 34
Command – C# • A receiver létrehozását akár maga a command is végezheti • Előny: rejtett receiver; Hátrány: receiverek megosztása 35
Command – WPF 36
Mediator 37
Mediator 38
Mediator 39
Mediator 40
Mediator – C# • A tervezési minta szerint a kommunikáló felek egymásról nem kaphatnak referenciát – a gyakorlatban ez olykor mégis előnyösebb 41
Mediator – Redux 42
Mediator – MVVM Light, PRISM 43
Mediator – ROS 44
4 5 Message Bus / Broker
Köszönöm a figyelmet! Behavioral tervezési minták Iterator, Chain of Responsibility Visitor Observer, Command, Mediator http: //users. nik. uni-obuda. hu/prog 4/ 46
- Slides: 46