Урок 10. Мост (Bridge)
Шаблон проектирования "Мост" (Bridge) используется для разделения абстракции и реализации, позволяя изменять их независимо друг от друга. Это особенно полезно, когда у вас есть несколько вариаций абстракций и реализаций, и вы хотите избежать создания множества подклассов.
Пример использования паттерна Bridge на Java
Рассмотрим пример, в котором мы создадим систему для рисования фигур. У нас будет абстракция Shape
и реализация DrawingAPI
, которая будет представлять различные способы рисования (например, рисование на экране или в консоли).
Шаг 1: Создание интерфейса реализации
public interface DrawingAPI {
void drawCircle(double x, double y, double radius);
}
Шаг 2: Реализация различных способов рисования
public class DrawingAPI1 implements DrawingAPI {
@Override
public void drawCircle(double x, double y, double radius) {
System.out.println("API1.circle at " + x + ":" + y + " radius " + radius);
}
}
public class DrawingAPI2 implements DrawingAPI {
@Override
public void drawCircle(double x, double y, double radius) {
System.out.println("API2.circle at " + x + ":" + y + " radius " + radius);
}
}
Шаг 3: Создание абстракции
public abstract class Shape {
protected DrawingAPI drawingAPI;
protected Shape(DrawingAPI drawingAPI) {
this.drawingAPI = drawingAPI;
}
public abstract void draw();
public abstract void resizeByPercentage(double pct);
}
Шаг 4: Реализация конкретных фигур
public class Circle extends Shape {
private double x, y, radius;
public Circle(double x, double y, double radius, DrawingAPI drawingAPI) {
super(drawingAPI);
this.x = x;
this.y = y;
this.radius = radius;
}
@Override
public void draw() {
drawingAPI.drawCircle(x, y, radius);
}
@Override
public void resizeByPercentage(double pct) {
radius *= (1 + pct / 100);
}
}
Шаг 5: Использование моста
Теперь мы можем использовать наш мост в коде:
public class BridgePatternDemo {
public static void main(String[] args) {
Shape circle1 = new Circle(5, 10, 2, new DrawingAPI1());
Shape circle2 = new Circle(20, 30, 3, new DrawingAPI2());
circle1.draw();
circle2.draw();
circle1.resizeByPercentage(10);
circle2.resizeByPercentage(20);
circle1.draw();
circle2.draw();
}
}
Объяснение
-
Интерфейс
DrawingAPI
: Определяет методdrawCircle()
, который будет реализован различными способами рисования. -
Классы
DrawingAPI1
иDrawingAPI2
: Реализуют интерфейсDrawingAPI
. Каждый из них определяет, как рисовать круг. -
Абстрактный класс
Shape
: Содержит ссылку наDrawingAPI
и определяет абстрактные методыdraw()
иresizeByPercentage()
. -
Класс
Circle
: Реализует абстракциюShape
. Он используетDrawingAPI
для рисования круга и может изменять радиус. -
Класс
BridgePatternDemo
: Демонстрирует использование моста. Мы создаем экземплярыCircle
с различными реализациямиDrawingAPI
и вызываем методы для рисования и изменения размера.
Заключение
Паттерн "Мост" позволяет разделить абстракцию и реализацию, что делает систему более гибкой и расширяемой. В приведенном примере мы увидели, как можно создать систему для рисования фигур, где абстракция и реализация могут изменяться независимо друг от друга.
пример
https://gitlab.com/synergy9980417/razdel2/7_10