Prezentace se nahrává, počkejte prosím

Prezentace se nahrává, počkejte prosím

Podobné prezentace


Prezentace na téma: "Bridge."— Transkript prezentace:

1 Bridge

2 Záměr Oddělení abstrakce od implementace
(tak, aby se mohly nezávisle na sobě měnit)

3 Příklad č. 1 (schéma)

4 Příklad č. 1 (schéma)

5 Příklad č. 1 (schéma)

6 Příklad č. 1 (schéma)

7 Schéma

8 Příklad č. 1 (kód) public interface IColor {
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;

9 Příklad č. 1 (kód) { protected IColor color;
public abstract class Shape { protected IColor color; protected Shape(IColor color) this.color = color; } public abstract void Draw();

10 Příklad č. 1 (kód) { public Circle(IColor color) : base(color) { }
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);

11 Příklad č. 1 (kód) { public static void Main(string[] args)
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); }

12 Příklad č. 2

13 Příklad č. 2

14 Exploze počtu tříd

15 Oddelění rozhraní (abstrakce) a implementace (= záměr GoF Bridge)
Příklad č. 2 (+ Bridge) Oddelění rozhraní (abstrakce) a implementace (= záměr GoF Bridge)

16 Příklad č. 2 (+ Bridge) Abstrakce implementace Klientská část rozhraní
Implementováno pomocí abstraktní implementace

17 Příklad č. 2 (+ Bridge)

18 Obecné schéma GoF Bridge

19 Obecné schéma GoF Bridge
Abstraction​ definuje abstraktní rozhraní (obecné chování) objektů,  obsahuje odkaz na Implementor​ RefinedAbstraction​ rozšiřuje/upravuje abstraktní rozhraní Implementor​ rozhraní implementací (obecně se liší libovolnou měrou od Abstraction)​ ConcreteImplementor ​ konkrétní implementace rozhraní Implementor​

20 definuje složitější operace pomocí jednodušších z Implementoru
Role objektů v GoF Bridge (High-Level vs Low-Level) definuje složitější operace pomocí jednodušších z Implementoru typicky obsahuje jen primitivní operace

21 Možnosti implementace Implementoru
Právě jeden Implementor [PIMPL] "degenerovaný Bridge"  není potřeba mít abstraktního předka (Implementor) lze takto skrýt detaily implementace před klientem při změně implementace není třeba rekompilovat klientský kód (stačí přelinkovat) Dva a více Implementorů Implementor se vybere v konstruktoru Abstraction implementaci může vytvářet i Abstract Factory (preferované)  implementace lze za run-time měnit (např. výběr efektivnějšího algoritmu – dle velikosti dat) Sdílení Implementorů Implementor je sdílen více objekty více objektů Abstraction má stejný objekt Implementor (C++) Reference counting (chybí GC) zrušení instance reprezentující implementaci po zrušení posledního odkazu

22 Připomenutí - schéma příkladu č. 2

23 konkrétní implementace
Příklad č. 2 (kód) Příklad: multiplatformní systém pro tvorbu GUI rozhraní objektů (abstrakce - abstraktní třída) rozšířené rozhraní (konkrétní třída, dědí z Window) 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 konkrétní implementace class IconWindow : public Window { public: void DrawContents() { WindowImp* imp = getWindowImp(); imp->Bitmap(”icon”, new Coord(0.0), new Coord(0.0)); }

24 Příklad č. 2 (kód) 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) { ... }

25 Proč použít Bridge? Flexibilnější návrh
oddělení abstraktního obecného mechanismu od "system-dependent stuff", aj. změna návrhu abstrakce neovlivňuje implementaci (a vice versa) možnost výběru implementace za běhu nezávislý vývoj implementace znovupoužitelnost implementací (např. pro další Bridge) (C++) Skrytí implementačních detailů před uživateli idiom PImpl Pointer to implementation

26 Související návrhové vzory
Abstract Factory Adapter jiný účel, jiná fáze vývoje Adapter - po návrhu, zajištění spolupráce mezi nezávislými třídami Bridge - při návrhu, abstrakce mající více implementací Object Adapter Bridge


Stáhnout ppt "Bridge."

Podobné prezentace


Reklamy Google