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 klaseShape
na 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"); } }
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
, RectangleGreen
at 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 Color
at tatlo sa mga pagpapatupad nito - BlackColor
, GreenColor
at 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
Color
sa klaseShape
- 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(); }
color
Gagamitin namin ang variable sa mga pagpapatupadShape
. Nangangahulugan ito na magagamit na ng mga hugis ang functionality ng interfaceColor
. -
Rectangle.java
public class Rectangle extends Shape { public Rectangle(Color color) { super(color); } @Override public void draw() { System.out.println("Drawing rectangle"); color.fillColor(); } }
Color color
ay isang tulay na nag-uugnay sa dalawang magkahiwalay na hierarchy ng klase.
Bridge device: ano ang abstraction at pagpapatupad
Давай рассмотрим с тобой диаграмму классов, которая описывает паттерн Bridge: Здесь можно увидеть две независимые структуры, которые могут модифицироваться, не затрагивая функционал друг друга. В нашем случае это:- 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:-
Если необходимо расширить количество сущностей в две стороны (геометрические фигуры, цвета).
-
Если есть желание разделить большой класс, который не отвечает принципу Single responsibility, на более маленькие классы с узкопрофильным функционалом.
-
При возможной необходимости вносить изменения в логику работы неких сущностей во время работы программы.
-
При необходимости спрятать реализацию от клиентов класса (библиотеки).
Плюсы и минусы паттерна
Как и другие паттерны, у Моста есть и преимущества, и недостатки. Преимущества Bridge:- Улучшает масштабируемость codeа — можно добавлять функционал, не боясь сломать что-то в другой части программы.
- Уменьшает количество подклассов — работает при необходимости расширения количества сущностей в две стороны (например, количество фигур и количество цветов).
- Дает возможность отдельно работать над двумя самостоятельными ветками Абстракции и Реализации — это могут делать два разных разработчика, не вникая в детали codeа друг друга.
- Уменьшение связанности классов — единственное место связки двух классов — это мост (поле
Color color
).
- В зависимости от конкретной ситуации и структуры проекта в целом, возможно негативное влияние на продуктивность программы (например, если нужно инициализировать большее количество an objectов).
- Усложняет читаемость codeа из-за необходимости навигации между классами.
GO TO FULL VERSION