Структурные паттерны: Мост (Bridge) C#
Назначение:
Мост (Bridge) - структурный шаблон проектирования, который позволяет отделить абстракцию от реализации таким образом, чтобы и абстракцию, и реализацию можно было изменять независимо друг от друга.
Шаблон Мост предполагает, что основной код, необходимый для функционирования объекта, переносится в реализацию. Всё остальное, включая взаимодействие с клиентом, содержится в абстракции. Её методы, при необходимости, могут быть изменены или дополнены. Кроме того, она содержит экземпляр реализации и использует его для обработки поступающих от клиентов запросов. Под обработкой подразумевается как прямая переадресация запроса, так и вызов группы методов реализации для получения результата.
Когда использовать паттерн мост?
-
Когда надо избежать постоянной привязки абстракции к реализации
-
Когда наряду с реализацией надо изменять и абстракцию независимо друг от друга. То есть изменения в абстракции не должно привести к изменениям в реализации
UML схема паттерна мост:
Реализация шаблона мост на C#
class Client
{
static void Main()
{
Abstraction abstraction;
abstraction = new RefinedAbstraction(new ConcreteImplementorA());
abstraction.Operation();
abstraction.Implementor=new ConcreteImplementorB();
abstraction.Operation();
}
}
abstract class Abstraction
{
protected Implementor implementor;
public Implementor Implementor
{
set { implementor = value; }
}
public Abstraction(Implementor imp)
{
implementor = imp;
}
public virtual void Operation()
{
implementor.OperationImp();
}
}
abstract class Implementor
{
public abstract void OperationImp();
}
class RefinedAbstraction : Abstraction
{
public RefinedAbstraction(Implementor imp)
: base(imp)
{}
public override void Operation()
{
}
}
class ConcreteImplementorA : Implementor
{
public override void OperationImp()
{
}
}
class ConcreteImplementorB : Implementor
{
public override void OperationImp()
{
}
}
Участники
-
Abstraction: определяет базовый интерфейс и хранит ссылку на объект Implementor. Выполнение операций в Abstraction делегируется методам объекта Implementor
-
RefinedAbstraction: уточненная абстракция, наследуется от Abstraction и расширяет унаследованный интерфейс
-
Implementor: определяет базовый интерфейс для конкретных реализаций. Как правило, Implementor определяет только примитивные операции. Более сложные операции, которые базируются на примитивных, определяются в Abstraction
-
ConcreteImplementorA и ConcreteImplementorB: конкретные реализации, которые унаследованы от Implementor
-
Client: использует объекты Abstraction
Схема примера использования паттерна мост из реальной жизни:
Применимость паттерна мост
- Когда вы хотите разделить монолитный класс, который содержит несколько различных реализаций какой-то функциональности (например, может работать с разными системами баз данных).
-
Чем больше класс, тем тяжелее разобраться в его коде, тем больше это затягивает разработку. Кроме того, изменения, вносимые в одну из реализаций, приводят к редактированию всего класса, что может привести к ошибкам.
-
Bridge позволяет разделить монолитный класс на несколько отдельных иерархий. После этого вы можете менять их код независимо друг от друга. Это упрощает работу над кодом и уменьшает вероятность внесения ошибок.
-
-
Когда вы хотите, чтобы реализацию можно было бы изменять во время выполнения программы.