Stáhnout prezentaci
Prezentace se nahrává, počkejte prosím
1
Bridge
2
Bridge – (de)motivační příklad
// Helps in providing truly decoupled architecture public interface IBridge { void Function1(); void Function2(); } public class Bridge1 : IBridge public void Function1() Console.WriteLine("Bridge1.Function1"); public void Function2() Console.WriteLine("Bridge1.Function2"); public class Bridge2 : IBridge Console.WriteLine("Bridge2.Function1"); Console.WriteLine("Bridge2.Function2");
3
Bridge – (de)motivační příklad
public interface IAbstractBridge { void CallMethod1(); void CallMethod2(); } public class AbstractBridge : IAbstractBridge public IBridge bridge; public AbstractBridge(IBridge bridge) this.bridge = bridge; public void CallMethod1() this.bridge.Function1(); public void CallMethod2() this.bridge.Function2();
4
Bridge – názorný příklad
5
Bridge – názorný příklad
6
Bridge – názorný příklad
7
Bridge – názorný příklad
8
Bridge – názorný příklad
9
Bridge – názorný příklad
10
Bridge – názorný příklad
11
Bridge – přepsaný motivační příklad
using System; namespace BridgePattern {// Helps in providing truly decoupled architecture public interface IColor { void PrintLine(int x, int y, int dx, int dy); void PrintPoint(int x, int y); } public class RedColor : IColor { public void PrintLine(int x, int y, int dx, int dy) { Console.BackgroundColor = ConsoleColor.Red; Console.WriteLine("line from ({0},{1}) to ({2},{3})", x, y, dx, dy); public void PrintPoint(int x, int y) { Console.WriteLine("point ({0},{1})", x, y); public class BlueColor : IColor { Console.BackgroundColor = ConsoleColor.Blue;
12
Bridge – přepsaný motivační příklad
public abstract class Shape { protected IColor color; protected Shape(IColor color) this.color = color; } public abstract void Draw();
13
Bridge – přepsaný motivační příklad
public class Circle : Shape { public Circle(IColor color) : base(color) { } public override void Draw() for (int i = 0; i < 2* Math.PI; i++) { int x = (int)Math.Sin(i); int y = (int)Math.Cos(i); color.PrintPoint(x,y); } public class Rectangle : Shape public Rectangle(IColor color) : base(color) { } color.PrintLine(0,0, 0,1); color.PrintLine(0,1, 2,1); color.PrintLine(2,1, 2,0); color.PrintLine(2,0, 0,0);
14
Bridge – přepsaný motivační příklad
class Program { public static void Main(string[] args) Shape s1 = new Rectangle(new RedColor()); Shape s2 = new Circle(new BlueColor()); s1.Draw(); s2.Draw(); Console.ReadKey(true); }
15
Bridge – výstup příkladu
16
Bridge – struktura Struktura Účastníci Abstraction RefinedAbstraction
typicky obsahuje jen primitivní operace definuje složitější operace pomocí jednodušších z Implementoru Struktura Účastníci Abstraction definuje abstraktní rozhraní objektů, obsahuje odkaz na implementaci s pomocí metod rozhraní Implementor RefinedAbstraction rozšiřuje rozhraní a metody z Abstraction Implementor rozhraní implementací (obecně se liší od Abstraction) ConcreteImplementor konkrétní implementace rozhraní Implementor
17
Bridge Účel Předpoklady oddělit rozhraní a konkrétní implementace
menší počet tříd pro implementaci nezávislý vývoj implementace snadná kompozice znovu-použitelnost implementací Předpoklady danou abstrakci navrhujeme existuje vhodný rozklad do primitivních operací
18
Bridge – použití Kdy je vhodné použít návrhový vzor Bridge?
Nechceme, aby rozhraní a implementace byly pevně svázány možnost výběru nebo přepínání implementace za běhu Chceme: abstrakci a její implementace rozšiřitelné pomoci dědičnosti kombinovat a nezávisle rozšiřovat implementace nemá vliv na klientský kód není nutná rekompilace (stačí znovu pustit linker) skrýt detaily implementace privátní data a metody se píší do hlavičkového souboru (C++) sdílet implementaci mezi více objekty nechceme, aby o tom klient věděl např. reference counting, structural sharing immutable objektů
19
Bridge – varianty, diskuze
Jeden Implementor [PIMPL (Pointer to IMPLementation)] degenerovaný případ účel: skrytí detailů implementace Abstraction má odkaz na třídu Implementor při změně implementace není třeba rekompilovat klientský kód Více Implementorů Implementor se vybere v konstruktoru Abstraction implementaci může vytvářet i Abstract Factory Sdílení Implementorů Implementor je sdílen více objekty více objektů Abstraction má stejný objekt Implementor C++ - reference counting pro zrušení implementace po zrušení posledního odkazu
20
Bridge – související návrhové vzory
Abstract Factory vytváří instance implementací java.awt.Toolkit, java.sql.DriverManager Adapter stejně jako Bridge implementuje rozhraní jedné třídy pomocí metod jiné třídy používá se v případě, že chceme nějakou již existující třídu přizpůsobit požadovanému rozhraní Bridge se používá už v době návrhu tříd Facade pár Abstrakce a Implementor jsou degenerovaný případ Abstrakce může zjednodušovat rozhraní Implementoru
21
Příklad č. 2
22
Motivace
23
Exploze počtu tříd
24
Rozdělme rozhraní a implementaci
Řešení Rozdělme rozhraní a implementaci
25
Klientská část rozhraní
Řešení Klientská část rozhraní
26
Řešení Abstrakce implementace Klientská část rozhraní
27
Řešení Abstrakce implementace Klientská část rozhraní
Implementováno pomocí abstraktní implementace
28
Řešení
29
Bridge – příklad Příklad: multiplatformní systém pro tvorbu GUI
rozhraní objektů rozšířené rozhraní odkaz na Implementora class Window { private: WindowImp* imp; public: void DrawContents() = 0; void DrawRect( Point p1, Point p2) { imp = getWindowImp(); imp->Rect(p1.getX(), p1.getY(), p2.getX(), p2.getY()); } protected: WindowImp getWindowImp() { if (imp == nullptr) { imp = WindowFactory.getInstance.makeWindowImp(); return imp; rozhraní pro potomky inicializace na žádost konkrétní implementace class IconWindow : public Window { public: void DrawContents() { WindowImp* imp = getWindowImp(); imp->Bitmap(”icon”, new Coord(0.0), new Coord(0.0)); } delegace
30
Bridge – příklad Příklad: multiplatformní systém pro tvorbu GUI
rozhraní implementací primitivní metody implementace XWindow a WinWindow implementují rozhraní WindowImp konkrétní kreslící funkce mohou obsahovat privátní položky class WindowImp { public: virtual void Rect(Coord c1, Coord c2, Coord c3, Coord c4) = 0; virtual void Text(String string, Coord c1, Coord c2) = 0; virtual void Bitmap(String string, Coord c1, Coord c2) = 0; ... } class XWindowImp : WindowImp { public: virtual void Rect( Coord c1, Coord c2, Coord c3, Coord c4) { ... } ... } class WinWindowImp : WindowImp { public: void Rect( Coord c1, Coord c2, Coord c3, Coord c4) { ... }
31
Diskuze
Podobné prezentace
© 2024 SlidePlayer.cz Inc.
All rights reserved.