CodeGym /Java blog /Véletlen /Híd tervezési minta
John Squirrels
Szint
San Francisco

Híd tervezési minta

Megjelent a csoportban
Szia! Most folytatjuk a elmélyülést egy kiterjedt és rendkívül fontos hasznos témában: a tervezési mintákban. Ma beszéljünk a hídmintáról. Más mintákhoz hasonlóan a hídminta is olyan tipikus problémák megoldására szolgál, amelyekkel a fejlesztő a szoftverarchitektúra tervezésekor találkozik. Ma tanulmányozzuk ennek a mintának a jellemzőit, és megtudjuk, hogyan kell használni.

Mi a híd mintája?

A hídminta egy szerkezeti tervezési minta. Más szóval, fő feladata egy teljes értékű struktúra létrehozása osztályokból és objektumokból. A híd ezt úgy teszi meg, hogy egy vagy több osztályt külön hierarchiára oszt fel: absztrakcióra és megvalósításra . A funkcionalitás változása az egyik hierarchiában nem von maga után változást a másikban. Ez mind szép és jó, de ez a meghatározás nagyon tág, és nem ad választ a legfontosabb kérdésre: "Mi az a hídminta?" Azt hiszem, könnyebben megértheti a gyakorlati alkalmazását. Tehát rögtön hozzunk létre egy klasszikus forgatókönyvet a hídmintához. Van egy absztrakt Shapeosztályunk, amely egy általános geometriai alakzatot képvisel:
  • Shape.java

    
    public abstract class Shape {
       public abstract void draw();
    }
    

    Amikor úgy döntünk, hogy alakzatokat, például háromszögeket és téglalapokat adunk hozzá, örökölni fogják az Shapeosztályt:

  • Rectangle.java:

    
    public class Rectangle extends Shape {
       @Override
       public void draw() {
           System.out.println("Drawing rectangle");
       }
    }
    
  • Triangle.java:

    
    public class Triangle extends Shape {
       @Override
       public void draw() {
           System.out.println("Drawing triangle");
       }
    }
    
Minden egyszerűnek tűnik egészen addig a pillanatig, amíg be nem vezetjük a szín fogalmát. Vagyis minden formának saját színe lesz, és a módszer funkcionalitása draw()ettől a színtől függ. Ahhoz, hogy a metódus különböző megvalósításai legyenek draw(), minden alakzat-szín kombinációhoz létre kell hoznunk egy osztályt. Ha három színünk van, akkor hat osztályra van szükségünk: TriangleBlack, TriangleGreen, TriangleRed, RectangleBlack, RectangleGreenés RectangleRed. A hat osztály nem olyan nagy probléma. De! Ha új formát vagy színt kell hozzáadnunk, akkor az osztályok száma exponenciálisan nő. Hogyan lehet kikerülni ebből a helyzetből? Nem a legjobb megoldás a színek tárolása egy mezőben és az összes lehetőség felsorolása feltételes utasításokkal. Jó megoldás a színek áthelyezése egy külön felületre. Alig van szó: hozzunk létre egy Colorfelületet három megvalósítással: BlackColor, GreenColorés RedColor:
  • Color.java:

    
    public interface Color {
       void fillColor();
    }
    
  • BlackColor.java:

    
    public class BlackColor implements Color {
       @Override
       public void fillColor() {
           System.out.println("Filling in black color");
       }
    }
    
  • GreenColor.java

    
    public class GreenColor implements Color {
       @Override
       public void fillColor() {
           System.out.println("Filling in green color");
       }
    }
    
  • RedColor.java

    
    public class RedColor implements Color {
       @Override
       public void fillColor() {
           System.out.println("Filling in red color");
       }
    }
    

    Most hozzáadunk egy Colormezőt az osztályhoz Shape. Értékét a konstruktorban fogjuk megtalálni.

  • Shape.java:

    
    public abstract class Shape {
       protected Color color;
      
       public Shape(Color color) {
           this.color = color;
       }
    
       public abstract void draw();
    }
    

    colorA változót az implementációkban fogjuk használni Shape. Ez azt jelenti, hogy az alakzatok mostantól használhatják a Colorfelület funkcióit.

  • Téglalap.java

    
    public class Rectangle extends Shape {
    
       public Rectangle(Color color) {
           super(color);
       }
    
       @Override
       public void draw() {
           System.out.println("Drawing rectangle");
           color.fillColor();
       }
    }
    
Ta-da! Most már a végtelenségig létrehozhatunk különböző színeket és formákat, és az osztályok száma csak lineárisan fog növekedni. A Color colormező egy híd, amely két különálló osztályhierarchiát köt össze.

Hogyan építsünk hidat: absztrakció és megvalósítás

Nézzünk meg egy osztálydiagramot, amely a hídmintát ábrázolja: A hídtervezési minta bemutatása - 2Itt két független struktúra látható, amelyek módosíthatók egymás funkcionalitásának befolyásolása nélkül. A mi esetünkben:
  • Az absztrakció az Shapeosztály
  • A RefinedAbstraction az Triangleés Rectangleosztályok
  • A végrehajtó az Colorinterfész
  • A ConcreteImplementor a BlackColor, GreenColorés RedColorosztályok.
Az Shapeosztály egy absztrakció – az alakzatok különféle színekkel való kitöltésének kezelésére szolgáló mechanizmus, amely az interfészre Color(Implementor) delegálódik. A Triangleés Rectangleosztályok konkrét osztályok, amelyek az osztály által elérhetővé tett mechanizmust használják Shape. BlackColor, GreenColorés RedColorkonkrét megvalósítások a megvalósítási hierarchiában.

Hol kell használni a hídmintát

Ennek a mintának az a hatalmas előnye, hogy az egyik hierarchiában a funkcionális osztályokat módosíthatja anélkül, hogy megtörné a másik logikáját. Ezenkívül ez a megközelítés segít csökkenteni az osztályok közötti kapcsolódást. Ennek a mintának a fő követelménye az, hogy „kövesse az utasításokat” – ne hagyja figyelmen kívül egyiket sem! Ebből a célból találjuk ki azokat a helyzeteket, amikor feltétlenül használnia kell a hídmintát:
  1. Ha két fogalom (pl. formák és színek) kombinációi alapján kell bővítenie az entitások számát.

  2. Ha egy nagy osztályt, amely nem felel meg az egyfelelősség elvének, kisebb osztályokra szeretne felosztani, amelyek szűk funkcionalitással rendelkeznek.

  3. Ha a program futása közben bizonyos entitások logikáján módosítani kell.

  4. Ha el kell rejteni egy implementációt az osztály vagy a könyvtár kliensei elől.

Amikor ezt a mintát használja, ne feledje, hogy ez további entitásokat ad hozzá a kódhoz – lehet, hogy nincs értelme olyan projektben használni, ahol csak egy forma és egy vagy két lehetséges szín van.

A minta előnyei és hátrányai

A többi mintához hasonlóan a hídnak is vannak előnyei és hátrányai. A hídminta előnyei:
  1. Javítja a kód méretezhetőségét – funkcionalitást bővíthet anélkül, hogy félne attól, hogy a program egy másik részében valami elromlik.
  2. Csökkenti az alosztályok számát, ha az entitások száma egyébként két fogalom (például formák és színek) kombinációján alapulna.
  3. Lehetővé teszi, hogy két különálló hierarchián – absztrakción és megvalósításon – külön dolgozzon. Két különböző fejlesztő módosíthat anélkül, hogy belemerülne egymás kódjának részleteibe.
  4. Csökkenti az osztályok közötti csatolást – az egyetlen hely, ahol a két osztály összekapcsolódik, a híd (azaz a Color colormező).
A hídminta hátrányai:
  1. A konkrét helyzettől és a projekt általános szerkezetétől függően ez negatívan befolyásolhatja a program teljesítményét (például ha több objektumot kell inicializálnia).
  2. Ez kevésbé olvashatóvá teszi a kódot, mivel váltani kell a két osztály között.

Különbség a stratégiai mintától

A hídmintát gyakran összekeverik egy másik tervezési mintával – a stratégiával. Mindketten kompozíciót használnak (bár a példában figurákkal és színekkel aggregációt alkalmaztunk, de a Bridge minta is használhat kompozíciót), más objektumokra delegálva a munkát. De van köztük különbség, és ez óriási. A stratégiai minta viselkedési minta: teljesen más problémákat old meg. A stratégia lehetővé teszi az algoritmusok felcserélését, míg a híd elválasztja az absztrakciót az implementációktól, hogy válasszon a különböző megvalósítások között. Más szavakkal, a stratégiával ellentétben a híd teljes entitásokra vagy hierarchikus struktúrákra vonatkozik. A hídminta jó fegyver lehet a fejlesztők arzenáljában. A lényeg az, hogy azonosítsuk azokat a helyzeteket, ahol érdemes használni, és felismerjük, mikor megfelelő más minta.
Hozzászólások
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION