Przejdź do głównej zawartości

[OOP] Ma czym polega wzorzec projektowy Most?


Most jest wzorcem projektowym, który pozwala nam uprościć hierarchię klas odseparowując od siebie pewne aspekty tych klas.

By to lepiej zrozumieć rozważmy prosty przykład: chcemy napisać program zajmujący się pojazdami - wstępnie samochodami i motorami. Piszemy prostą hierarchię klas.

    class Vehicle
    {

    }

    class Car : Vehicle
    {

    }

    class Motorcycle : Vehicle
    {

    }

Na razie wszystko jest w porządku, a hierarchia wygląda tak:



Z czasem jednak pojawia się potrzeba reprezentowania w programie samochodów i motorów elektrycznych. Nasza hierarchia klas bardzo się rozrasta:

    class Vehicle
    {

    }

    class Car : Vehicle
    {

    }

    class ElectricCar : Car
    {

    }

    class CombustionCar : Car
    {

    }

    class Motorcycle : Vehicle
    {

    }

    class ElectricMotorcycle : Motorcycle
    {

    }

    class CombustionMotorcycle : Motorcycle
    {

    }

Diagram klas wygląda teraz tak:


Nie wygląda to dobrze. Z trzech klas zrobiło się siedem. Kiedy pojawi się nowy rodzaj pojazdu lub nowy rodzaj napędu, nasza hierarchia rozrośnie się jeszcze bardziej, a utrzymanie jej będzie coraz cięższe. Na pomoc przychodzi wzorzec projektowy Most. Chcemy odseparować koncept napędu do zupełnie osobnej klasy. Klasa Vehicle będzie posiadała obiekt klasy napęd. Zamiast rozbudowanego dziedziczenia zastosujemy kompozycję. Zobaczmy, jak zmienił się kod:


    class Vehicle
    {
        protected Drive _drive;

        public Vehicle(Drive drive)
        {
            _drive = drive;
        }
    }

    class Car : Vehicle
    {
        public Car(Drive drive) : base(drive)
        {
        }
    }

    class Motorcycle : Vehicle
    {
        public Motorcycle(Drive drive) : base(drive)
        {
        }
    }

    class Drive
    {

    }

    class ElectricDrive : Drive
    {

    }

    class CombustionDrive : Drive
    {

    }

Jak teraz wygląda hierarchia klas?


Znacznie lepiej. Dodając nowy rodzaj pojazdu będziemy musieli utworzyć tylko jedną nową klasę. Odseparowaliśmy logicznie niezależne od siebie koncepty - pojazdu i napędu, co sprawiło że nasze klasy są bardziej spójne.

Na tym właśnie polega wzorzec Most. Należy on do strukturalnych wzorców projektowych. Więcej o rodzajach wzorców można poczytać tutaj [under construction].

W tym poście korzystałam z:

  • https://en.wikipedia.org/wiki/Composition_over_inheritance
  • https://stackoverflow.com/questions/319728/when-do-you-use-the-bridge-pattern-how-is-it-different-from-adapter-pattern

Komentarze