Сегодня мы рассмотрим паттерн проектирования мост в Java. Когда у нас есть иерархии интерфейсов как в интерфейсах, так и в реализациях, то используется паттерн проектирования мост для отделения интерфейсов от реализации и скрытия деталей реализации от клиентских программ.
Паттерн проектирования мост
Так же, как и паттерн адаптера, паттерн проектирования мост является одним из структурных паттернов. Согласно GoF, паттерн проектирования моста заключается в следующем:
Разделите абстракцию от ее реализации, чтобы они могли изменяться независимо друг от друга
Реализация паттерна проектирования моста следует принципу предпочтения композиции перед наследованием.
Пример паттерна проектирования мост в Java
Если мы изучим шаблон проектирования мост с примером, будет легче понять. Допустим, у нас есть иерархия интерфейсов как на изображении ниже. Теперь мы будем использовать шаблон проектирования мост для разделения интерфейсов от реализации. UML-диаграмма классов и интерфейсов после применения шаблона мост будет выглядеть примерно как на изображении ниже.
Обратите внимание на мост между интерфейсами
Shape
и Color
и использование композиции при реализации шаблона мост. Вот код на языке Java для интерфейсов Shape и Color. Color.java
package com.journaldev.design.bridge;
public interface Color {
public void applyColor();
}
Shape.java
package com.journaldev.design.bridge;
public abstract class Shape {
// Композиция - реализатор
protected Color color;
// Конструктор с реализатором в качестве аргумента
public Shape(Color c){
this.color=c;
}
abstract public void applyColor();
}
У нас есть классы реализации Triangle и Pentagon следующего вида. Triangle.java
package com.journaldev.design.bridge;
public class Triangle extends Shape{
public Triangle(Color c) {
super(c);
}
@Override
public void applyColor() {
System.out.print("Triangle filled with color ");
color.applyColor();
}
}
Pentagon.java
package com.journaldev.design.bridge;
public class Pentagon extends Shape{
public Pentagon(Color c) {
super(c);
}
@Override
public void applyColor() {
System.out.print("Pentagon filled with color ");
color.applyColor();
}
}
Вот классы реализации для RedColor и GreenColor. RedColor.java
package com.journaldev.design.bridge;
public class RedColor implements Color{
public void applyColor(){
System.out.println("red.");
}
}
GreenColor.java
package com.journaldev.design.bridge;
public class GreenColor implements Color{
public void applyColor(){
System.out.println("green.");
}
}
Давайте протестируем нашу реализацию шаблона мост с тестовой программой. BridgePatternTest.java
package com.journaldev.design.test;
import com.journaldev.design.bridge.GreenColor;
import com.journaldev.design.bridge.Pentagon;
import com.journaldev.design.bridge.RedColor;
import com.journaldev.design.bridge.Shape;
import com.journaldev.design.bridge.Triangle;
public class BridgePatternTest {
public static void main(String[] args) {
Shape tri = new Triangle(new RedColor());
tri.applyColor();
Shape pent = new Pentagon(new GreenColor());
pent.applyColor();
}
}
Результат выполнения примера программы с использованием шаблона мост:
Triangle filled with color red.
Pentagon filled with color green.
Шаблон проектирования моста может быть использован, когда как абстракция, так и реализация могут иметь разные иерархии независимо, и мы хотим скрыть реализацию от клиентского приложения.
Source:
https://www.digitalocean.com/community/tutorials/bridge-design-pattern-java