JavaRush /Java Blog /Random-TL /Pattern ng Disenyo ng Tulay

Pattern ng Disenyo ng Tulay

Nai-publish sa grupo
Kamusta! Patuloy kaming nauunawaan ang isang malawak at napakakapaki-pakinabang na paksa - mga pattern ng disenyo. Ngayon ay pag-uusapan natin ang tungkol sa Bridge. Tulad ng ibang mga pattern, nagsisilbi ang Bridge upang malutas ang mga karaniwang problema na kinakaharap ng isang developer kapag nagdidisenyo ng arkitektura ng software. Pag-aralan natin ang mga tampok nito ngayon at alamin kung paano ito gamitin.

Ano ang tulay ng tulay?

Ang tulay ng tulay ay isang structural design pattern. Iyon ay, ang pangunahing gawain nito ay ang lumikha ng isang ganap na istraktura ng mga klase at bagay. Niresolba ng Bridge ang problemang ito sa pamamagitan ng paghahati ng isa o higit pang mga klase sa magkakahiwalay na hierarchies - abstraction at pagpapatupad . Ang pagbabago sa functionality sa isang hierarchy ay hindi nangangailangan ng mga pagbabago sa isa pa. Ang lahat ay tila malinaw, ngunit sa katunayan ang kahulugan na ito ay napakalawak at hindi sumasagot sa pangunahing tanong: "Ano ang tulay ng tulay?" Sa tingin ko ito ay magiging mas madali para sa iyo na malaman sa pagsasanay. Magmodelo kaagad tayo ng isang klasikong halimbawa para sa pattern ng Bridge. Mayroon kaming abstract na klase Shapena karaniwang naglalarawan ng isang geometric na pigura:
  • Shape.java

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

    Kapag nagpasya kaming magdagdag ng mga hugis na tatsulok at parihaba, kami ay magmamana mula sa klase Shape:

  • 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");
       }
    }
Ang lahat ay mukhang simple hanggang sa ipakilala natin ang konsepto ng "kulay". Iyon ay, ang bawat figure ay magkakaroon ng sarili nitong kulay, kung saan ang pag-andar ng pamamaraan ay nakasalalay draw(). Upang magkaroon ng iba't ibang pagpapatupad ng pamamaraan draw(), kailangan nating lumikha ng isang klase para sa bawat hugis na tumutugma sa isang kulay. Kung mayroong tatlong kulay, mayroong anim na klase: TriangleBlack, TriangleGreen, TriangleRed, RectangleBlack, RectangleGreenat RectangleRed. Ang anim na klase ay hindi ganoon kalaki. Ngunit! Kung kailangan nating magdagdag ng bagong hugis o kulay, ang bilang ng mga klase ay tataas nang husto. Paano makaalis sa ganitong sitwasyon? Ang pag-imbak ng mga kulay sa isang field at pagsubok ng mga opsyon sa pamamagitan ng mga kondisyon ay hindi ang pinakamahusay na solusyon. Ang isang magandang solusyon ay ang pagpapakita ng kulay sa isang hiwalay na interface . Wala pang maagang sinabi kaysa tapos na: gumawa tayo ng interface Colorat tatlo sa mga pagpapatupad nito - BlackColor, GreenColorat 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");
       }
    }

    Ngayon magdagdag tayo ng isang uri ng field Colorsa klase Shape- matatanggap natin ang halaga nito sa constructor.

  • Shape.java:

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

    colorGagamitin namin ang variable sa mga pagpapatupad Shape. Nangangahulugan ito na magagamit na ng mga hugis ang functionality ng interface Color.

  • Rectangle.java

    public class Rectangle extends Shape {
    
       public Rectangle(Color color) {
           super(color);
       }
    
       @Override
       public void draw() {
           System.out.println("Drawing rectangle");
           color.fillColor();
       }
    }
Eto na! Ngayon ay makakagawa na tayo ng iba't ibang kulay at geometric na hugis kahit na ad infinitum, na nagpapataas ng bilang ng mga klase sa pag-unlad ng aritmetika. Ang field Color coloray isang tulay na nag-uugnay sa dalawang magkahiwalay na hierarchy ng klase.

Bridge device: ano ang abstraction at pagpapatupad

Давай рассмотрим с тобой диаграмму классов, которая описывает паттерн Bridge: Знакомство с паттерном проектирования Bridge - 2Здесь можно увидеть две независимые структуры, которые могут модифицироваться, не затрагивая функционал друг друга. В нашем случае это:
  • Abstraction — класс Shape;
  • RefinedAbstraction — классы Triangle, Rectangle;
  • Implementor — интерфейс Color;
  • ConcreteImplementor — классы BlackColor, GreenColor и RedColor.
Класс Shape представляет собой Абстракцию — механизм управления раскраской фигур в различные цвета, который делегирует Реализацию интерфейсу Color. Классы Triangle, Rectangle являются реальными an objectми, которые используют механизм, предложенный классом Shape. BlackColor, GreenColor и RedColor — конкретные имплементации в ветке Реализация. Их часто называют платформой.

Где используют паттерн Bridge

Огромный плюс использования этого паттерна заключается в том, что можно вносить изменения в функционал классов одной ветки, не ломая при этом логику другой. Также такой подход помогает уменьшить связанность классов программы. Главное condition применения паттернов — “следовать инструкции”: не совать их куда попало! Собственно, давай разберемся, в Howих случаях точно нужно использовать Bridge:
  1. Если необходимо расширить количество сущностей в две стороны (геометрические фигуры, цвета).

  2. Если есть желание разделить большой класс, который не отвечает принципу Single responsibility, на более маленькие классы с узкопрофильным функционалом.

  3. При возможной необходимости вносить изменения в логику работы неких сущностей во время работы программы.

  4. При необходимости спрятать реализацию от клиентов класса (библиотеки).

При использовании паттерна каждый раз нужно помнить, что он добавляет дополнительные сущности в code — не совсем логично применять его в проекте, где всего одна геометрическая фигура и один-два возможных ее цвета.

Плюсы и минусы паттерна

Как и другие паттерны, у Моста есть и преимущества, и недостатки. Преимущества Bridge:
  1. Улучшает масштабируемость codeа — можно добавлять функционал, не боясь сломать что-то в другой части программы.
  2. Уменьшает количество подклассов — работает при необходимости расширения количества сущностей в две стороны (например, количество фигур и количество цветов).
  3. Дает возможность отдельно работать над двумя самостоятельными ветками Абстракции и Реализации — это могут делать два разных разработчика, не вникая в детали codeа друг друга.
  4. Уменьшение связанности классов — единственное место связки двух классов — это мост (поле Color color).
Недостатки Bridge:
  1. В зависимости от конкретной ситуации и структуры проекта в целом, возможно негативное влияние на продуктивность программы (например, если нужно инициализировать большее количество an objectов).
  2. Усложняет читаемость codeа из-за необходимости навигации между классами.

Отличие от паттерна Strategy

Паттерн Bridge часто путают с другим шаблоном проектирования — Strategy. Они оба используют композицию (в примере с фигурами и цветами мы использовали агрегацию, но паттерн Bridge может использовать и композицию), делегируя работу другим an objectм. Но разница между ними есть, и она огромная. Паттерн Strategy является поведенческим паттерном: он решает совсем другие задачи. Strategy обеспечивает взаимозаменяемость алгоритмов, в то время How Bridge отделяет абстракцию от реализации, чтобы обеспечить возможность выбора между различными имплементациями. То есть, Bridge, в отличие от Strategy, применяется к целым конструкциям or иерархическим структурам. Паттерн Bridge может стать хорошим оружием в арсенале разработчика, главное нащупать те ситуации где стоит применить его, or воспользоваться Howим-то другим шаблоном. Если ты еще не знаком с другими шаблонами, почитай вот эти материалы:
Mga komento
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION