Мост (Bridge)

Шаблон Мост позволяет разделить объект на абстракцию и реализацию так, чтобы они могли изменяться независимо друг от друга. При этом основной код, необходимый для функционирования объекта, переносится в реализацию. Всё остальное, включая взаимодействие с клиентом, содержится в абстракции. Методы абстракции при необходимости могут быть изменены или дополнены. Абстракция содержит экземпляр реализации и использует его для обработки поступающих от клиента запросов.

Выделим следующих участников шаблона Мост (рис. 5). Класс Abstraction определяет базовую абстракцию. Класс RefinedAbstraction наследуется от Abstraction и представляет уточнённый функционал взаимодействия. Интерфейс IImplementor является интерфейсом реализации. Конкретная реализация описывается классом ConcreteImplementor.

Рис. 5. Дизайн шаблона Мост.

Проиллюстрируем применение шаблона Мост. Пусть имеется класс RecordBase, который описывает функции для работы с набором записей.

public class RecordBase

{

public IDataObject<string> DataObject { get; set; }

public virtual void Next()

{

DataObject.NextRecord();

}

public virtual void Prior()

{

DataObject.PriorRecord();

}

public virtual void Add(string name)

{

DataObject.AddRecord(name);

}

public virtual void Delete(string name)

{

DataObject.DeleteRecord(name);

}

public virtual void Get()

{

var customer = DataObject.GetCurrentRecord();

Console.WriteLine(customer);

}

}

Класс Record уточняет одну из функций класса RecordBase:

public class Record: RecordBase

{

public override void Get()

{

Console.WriteLine("----------");

base.Get();

Console.WriteLine("----------");

}

}

Интерфейс IDataObject<T> задаёт методы хранилища записей.

public interface IDataObject<T>

{

void NextRecord();

void PriorRecord();

void AddRecord(T t);

void DeleteRecord(T t);

T GetCurrentRecord();

}

Класс ListData описывает конкретное хранилище (список строк).

public class ListData: IDataObject<string>

{

private readonly List<string> _records;

private int _current;

public ListData()

{

_records = new List<string> {"Jim Jones", "Samuel Jackson"};

}

public void NextRecord()

{

if (_current < _records.Count - 1)

{

_current++;

}

}

public void PriorRecord()

{

if (_current > 0)

{

_current--;

}

}

public void AddRecord(string customer)

{

_records.Add(customer);

}

public void DeleteRecord(string customer)

{

_records.Remove(customer);

}

public string GetCurrentRecord()

{

return _records[_current];

}

}

Указанные классы можно использовать следующим образом:

// создаём объект уточнённого функционала

var record = new Record();

// связываем с конкретной реализацией

record.DataObject = new ListData();

// косвенно вызываем методы конкретной реализации

record.Get();

record.Next();

record.Get();


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: