Шаблон проектирования моста на Java

Сегодня мы рассмотрим паттерн проектирования мост в 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