Stáhnout prezentaci
Prezentace se nahrává, počkejte prosím
1
Facade [f ə ˈ s ɑː d]f ə ˈ s ɑː d
2
Facade Před: Po:
3
Facade Subsystémy (Zordi)Fasáda (Megazord)
4
Facade Známý jako Facade, Fasáda Motivace Rozdělení systému na subsystémy Subsystém = množina tříd a dalších subsystémů Rozhraní subsystému se s přibývajícíma třídami stává složitým Řešením je zavedení fasády - sjednocené high-level rozhraní Řada užitečných vlastností Zapouzdření – uživatel nemusí pracovat přímo se třídami subsystému Použití subsystémů je zjednodušeno Redukce závislosti mezi subsystémy Zjednodušuje komunikaci subsystémů Decoupling Zvyšuje přenositelnost …
5
Facade – zákaznická podpora Klient si objednává produkt po telefonu z katalogu Operátor podpory predstavuje prostředníka mezi klientem a jednotlivými službami Klient nepotřebuje žádné znalosti o fungování firmy, pouze zadá objednávku Jednotlivé fáze objednávky (doprava, platba, …) mohou být zprostředkované různými firmami Ty se mohou časem měnit
6
Facade – domácí kino projektor DVD přehrávač žaluzie HI-FI soustava Puštění filmu: zatáhnutí žaluzií zapnutí projektoru zapnutí DVD přehrávače zapnutí ozvučení Ukončení přehrávání: vypnout DVD přehrávač vypnout ozvučení vypnout projektor vytáhnout žaluzie
7
Facade – domácí kino Řešení: Univerzální ovladač s funkcemi: Přehrát film Ukončit film … zatáhnout žaluzie zapnout projektor zapnout DVD přehrávač zapnout ozvučení vypnout DVD přehrávač vypnout ozvučení vypnout projektor vytáhnout žaluzie
8
Facade – kompilátor Účastníci Fasáda – Compiler Přijímá high-level požadavky Deleguje požadavky klienta mezi třídy subsystému Může vykonávat vlastní práci (napr. Adapter)
9
Facade – kompilátor Účastníci Subsystémy – Scanner, Parser, … Implementují logickou část kompilátoru Vykonávají příchozí požadavky od fasády O fasádě nevědí (transparentnost) Nejsou skryté (!)
10
Facade – kompilátor class Scanner { public: … Scanner(istream&); virtual Token& Scan(); … }; Třída subsystému class Parser { public: … virtual void Parse(Scanner&, ProgramNodeBuilder&); … }; Třída subsystému class ProgramNodeBuilder { public: ProgramNodeBuilder(); virtual ProgramNode* NewVariable(…); virtual ProgramNode* NewAssignment(…); virtual ProgramNode* NewReturnStatement(…); virtual ProgramNode* NewCondition(…) const; … ProgramNode* GetRootNode(); … }; Třída subsystému
11
Facade – kompilátor class ProgramNode { public: // program node manipulation virtual void GetSourcePosition(int& line, int& index); … // child manipulation virtual void Add(ProgramNode*); virtual void Remove(ProgramNode*); … virtual void Traverse(CodeGenerator&); protected: ProgramNode(); }; Třída subsystému void ExpressionNode::Traverse (CodeGenerator& cg) { cg.Visit(this); ListIterator i(_children); for (i.First(); !i.IsDone(); i.Next()) { i.CurrentItem()->Traverse(cg); }
12
Facade – kompilátor class Compiler { public: Compiler(); virtual void Compile(istream&,BytecodeStream&); }; void Compiler::Compile ( istream& input, BytecodeStream& output ) { Scanner scanner(input); ProgramNodeBuilder builder; Parser parser; parser.Parse(scanner, builder); RISCCodeGenerator generator(output); // potomek CodeGenerator ProgramNode* parseTree = builder.GetRootNode(); parseTree->Traverse(generator); } Facade class CodeGenerator { public: virtual void Visit(StatementNode*); virtual void Visit(ExpressionNode*); … protected: CodeGenerator(BytecodeStream&); protected: BytecodeStream& _output; }; Třída subsystému
13
Facade – volání funkce Diagram volání funkce Uživatel využívá Facade pro přístupu k systému
14
Facade – reálná implementace Systém kombinující info o letech a hotelech
15
Použití Když je subsystém složitý na přímé použití Cena za vytvoření fasády < nastudování subsystému uživateli Umožnuje obalit množinu špatně navržených API do jednoho lepšího Když existuje mnoho závislostí vně subsystému/mezi subsystémy Komunikace skrz fasádu (higher-level interface) Při vytváření vstupních bodů vrstveného systému Výhody použití Redukuje počet objektů, se kterými klienti komunikují Snadnější použití subsystému Snadnější nahrazení částí subsystému a rozšíření subsystému Zmenšuje počet závislostí mezi klienty a subsystémem Odstraňuje komplexní a kruhové závislosti Méně kompilačních závislostí Neskrývá třídy subsystému Jednoduchost nebo použití na „míru“ Facade – použití
16
Facade – implementace Fasáda jako abstraktní třída (příp. interface) Konkrétní implementace pro konkrétní subsystém je jejím potomkem Klienti komunikují se subsystémem přes rozhraní abstraktní třídy Klient nemusí vědět, která implementace byla použita Flexibilita Fasáda jako jedna konfigurovatelná třída Slabší alternativa Výměna komponent subsystému za běhu Dependency Injection, Inversion of Control
17
Typické chyby Fasáda vůbec nebyla zapotřebí Subsystém je příliš jednoduchý Fasáda byla implementována už od začátku Má přibýt až když je potřebná Uživatel je nucen fasádu používat Třídy subsystému jsou privátní Fasáda neslouží k zvýšení bezpečnosti Nic neskrývá Subsystém o fasádě ví Třídy subsystému si drží referenci na fasádu Fasáda implementuje více než by měla Facade – použití
18
V mobilních aplikacích OS jako Façade Interface pro ovládání přístoje Session Façade, Core J2EE Patterns Fasáda pro webové služby JOptionPane ve Swingu vytváří a zobrazuje různé typy základních dialogových oken zjednodušuje používání této rozsáhlé knihovny Tomcat a jeho servlet API Facade – reálné použití
19
Wrapper Facade je návrhový vzor vycházející z Facade Místo celých subsystémů obaluje volání nízko úrovňového API OS C API, Socket či Thread knihovny nebo GUI Často se používá pro zvýšení prenositelnosti, robustnosti a udržovatelnosti částí kódu závislých na OS Příklady Microsoft Foundation Classes, Java Foundation Class Libraries (Swing, AWT,...) Nabízí vysoko úrovňové GUI API obalením např. Win32 C API Modul standartní C++ knihovny Standard udává rozhraní, pro implementaci bývají použity různé knihovny Například knihovna pthread použitá kompilátory Clang a G++ Facade – reálné použití (Wrapper Facade)
20
Facade – související vzory Abstract Factory Fasáda může poskytovat rozhraní pro tvorbu objektů Singleton Fasáda jako Singleton - jen jeden vstupní bod do systému Adapter Adapter také tvoří interface pro přístup k systému Nadstavba nad existujícími rozhraními Primární funkci – standardizovat rozhraní Mediator Mediator také snižuje závislosti Komponenty subsystému přes něj komunikují (vědí o něm!) Mediator abstrahuje funkcionalitu ze tříd a sám ji implementuje
21
Facade – shrnutí (aneb výhody po třetí) Poskytuje zjednodušené rozhraní Komfort uživatele je priorita Ale neskrývá ani původní rozhraní Zapouzdřuje subsystém Množina špatně navržených API alternována jediným dobře navrhnutým API Eliminuje závislosti všeho druhu Klient – subsystém Subsystém – subsystém Mezi dvěma třídami subsystému Ve výsledku eliminuje i kompilační závislosti …
Podobné prezentace
© 2024 SlidePlayer.cz Inc.
All rights reserved.