Какъв е моделът на моста?
Моделът на моста е модел на структурно проектиране. С други думи, основната му работа е да създаде пълноценна структура от класове и обекти. Мостът прави това, като разделя един or повече класове на отделни йерархии: абстракция и реализация . Промяна във функционалността в една йерархия не води до промяна в другата. Всичко това е добре, но тази дефиниция е много широка и не отговаря на най-важния въпрос: "Какъв е моделът на моста?" Мисля, че ще ви бъде по-лесно да разберете практическото му приложение. Така че веднага, нека създадем класически сценарий за модела на моста. Имаме абстрактенShape
клас, който представлява обща геометрична фигура:
-
Shape.java
public abstract class Shape { public abstract void draw(); }
Когато решим да добавим форми като триъгълници и правоъгълници, ще ги накараме да наследят
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()
метода. За да имаме различни реализации на draw()
метода, трябва да създадем клас за всяка комбинация форма-цвят. Ако имаме три цвята, тогава имаме нужда от шест класа : TriangleBlack
, TriangleGreen
, TriangleRed
, и . Шест класа не са толкова голям проблем. Но! Ако трябва да добавим нова форма or цвят, тогава броят на класовете нараства експоненциално. Как да излезем от тази ситуация? Съхраняването на цвят в поле и изброяването на всички опции с помощта на условни изрази не е най-доброто решение. Добро решение е да преместите цвета в отделен интерфейсRectangleBlack
RectangleGreen
RectangleRed
. Едва казано, така напequalsо: нека създадем Color
интерфейс с три реализации: BlackColor
, GreenColor
и 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"); } }
Сега добавяме
Color
поле къмShape
класа. Ще получим стойността му в конструктора. -
Shape.java:
public abstract class Shape { protected Color color; public Shape(Color color) { this.color = color; } public abstract void draw(); }
Ще използваме
color
променливата вShape
реализациите. Това означава, че формите вече могат да използват функционалността наColor
интерфейса. -
Правоъгълник.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
е мост, който свързва две отделни класови йерархии.
Как да изградим мост: абстракция и реализация
Нека да разгледаме диаграма на класове, която изобразява модела на моста:
- Абстракцията е
Shape
класът - RefinedAbstraction е класовете
Triangle
andRectangle
- Implementor е
Color
интерфейсът - ConcreteImplementor е
BlackColor
класоветеGreenColor
иRedColor
.
Shape
е абстракция — механизъм за управление на запълването на форми с различни цветове, който делегира на интерфейса Color
(Implementor). Класовете Triangle
и Rectangle
са конкретни класове, които използват механизма, предоставен от Shape
класа. BlackColor
и са конкретни реализации в йерархията на изпълнението GreenColor
.RedColor
Къде да използвате модела на моста
Огромна полза от използването на този модел е, че можете да правите промени във функционалните класове в една йерархия, без да нарушавате логиката на другата. Освен това този подход помага да се намали свързването между класовете. Основното изискване при използването на този модел е „следвайте инструкциите“ — не пренебрегвайте нито една от тях! За тази цел, нека да разберем ситуациите, когато определено трябва да използвате модела на моста:-
Ако трябва да разширите броя на обектите въз основа на комбинации от две концепции (напр. форми и цветове).
-
Ако искате да разделите голям клас, който не отговаря на принципа за единична отговорност, на по-малки класове, които имат тясна функционалност.
-
Ако е необходимо да се направят промени в логиката на определени обекти, докато програмата работи.
-
Ако е необходимо да се скрие изпълнение от клиентите на класа or библиотеката.
Плюсове и минуси на модела
Подобно на други модели, мостът има Howто предимства, така и недостатъци. Предимства на модела на моста:- Той подобрява скалируемостта на codeа — можете да добавите функционалност, без да се страхувате, че ще счупите нещо в друга част на програмата.
- Той намалява броя на подкласовете, когато броят на обектите иначе би се основавал на комбинации от две концепции (например форми и цветове).
- Това дава възможност да се работи отделно върху две отделни йерархии — абстракция и имплементация. Двама различни разработчици могат да правят промени, без да навлизат в детайлите на codeа на другия.
- Той намалява свързването между класовете — единственото място, където двата класа са свързани, е мостът (т.е. полето
Color color
).
- В зависимост от конкретната ситуация и цялостната структура на даден проект, това може да повлияе отрицателно на производителността на програмата (например, ако трябва да инициализирате повече обекти).
- Това прави codeа по-малко четлив поради необходимостта от превключване между двата класа.
GO TO FULL VERSION