Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Билеты ООП / 16. Паттерн Bridge (мост)

.docx
Скачиваний:
73
Добавлен:
16.03.2016
Размер:
34.69 Кб
Скачать

В системе могут существовать классы, отношения между которыми строятся в соответствии со следующей объектно-ориентированной иерархией: абстрактный базовый класс объявляет интерфейс, а конкретные подклассы реализуют его нужным образом. Такой подход является стандартным в ООП, однако, ему свойственны следующие недостатки:

  1. Система, построенная на основе наследования, является статичной. Реализация жестко привязана к интерфейсу. Изменить реализацию объекта некоторого типа в процессе выполнения программы уже невозможно.

  2. Система становится трудно поддерживаемой, если число родственных производных классов становится большим.

Шаблон мост (англ. Bridge) — структурный шаблон проектирования, используемый в проектировании программного обеспечения чтобы «разделять абстракцию и реализацию так, чтобы они могли изменяться независимо». Шаблон bridge использует инкапсуляцию, агрегирование и может использовать наследование для того, чтобы разделить ответственность между классами.

Цель

При частом изменении класса преимущества объектно-ориентированного подхода становятся очень полезными, позволяя делать изменения в программе, обладая минимальными сведениями о реализации программы. Шаблон bridge является полезным там, где часто меняется не только сам класс, но и то, что он делает.

Описание

Когда абстракция и реализация разделены, они могут изменяться независимо. Другими словами, при реализации через паттерн мост, изменение структуры интерфейса не мешает изменению структуры реализации. Рассмотрим такую абстракцию как фигура. Существует множество типов фигур, каждая со своими свойствами и методами. Однако есть что-то, что объединяет все фигуры. Например, каждая фигура должна уметь рисовать себя, масштабироваться и т. п. В то же время рисование графики может отличаться в зависимости от типа ОС, или графической библиотеки. Фигуры должны иметь возможность рисовать себя в различных графических средах, но реализовывать в каждой фигуре все способы рисования или модифицировать фигуру каждый раз при изменении способа рисования непрактично. В этом случае помогает шаблон bridge, позволяя создавать новые классы, которые будут реализовывать рисование в различных графических средах. При использовании такого подхода очень легко можно добавлять как новые фигуры, так и способы их рисования.

Связь, изображаемая стрелкой на диаграммах, может иметь 2 смысла: а) "разновидность", в соответствии с принципом подстановки Б. Лисков и б) одна из возможных реализаций абстракции. Обычно в языках используется наследование для реализации как а), так и б), что приводит к разбуханию иерархий классов.

Мост служит именно для решения этой проблемы: объекты создаются парами из объекта класса иерархии А и иерархии B, наследование внутри иерархии А имеет смысл "разновидность" по Лисков, а для понятия "реализация абстракции" используется ссылка из объекта A в парный ему объект B.

Реализация

using System;

namespace Bridge

{

// MainApp test application

class MainApp

{

static void Main()

{

Abstraction ab = new RefinedAbstraction();

// Set implementation and call

ab.Implementor = new ConcreteImplementorA();

ab.Operation();

// Change implementation and call

ab.Implementor = new ConcreteImplementorB();

ab.Operation();

// Wait for user

Console.Read();

}

}

/// Abstraction - абстракция

/// определяем интерфейс абстракции;

/// хранит ссылку на объект

class Abstraction

{

protected Implementor implementor;

// Property

public Implementor Implementor

{

get{ return implementor; }

set{ implementor = value; }

}

public virtual void Operation()

{

implementor.Operation();

}

}

/// Implementor - реализатор

/// определяет интерфейс для классов реализации. Он не обязан точно

/// соотведствовать интерфейсу класса. На самом деле оба

/// интерфейса могут быть совершенно различны. Обычно интерфейс класса

/// представляет только примитивные операции, а класс

/// определяет операции более высокого уровня,

/// базирующиеся на этих примитивах;

abstract class Implementor

{

public abstract void Operation();

}

/// RefinedAbstraction - уточненная абстракция

/// расширяет интерфейс, определенный абстракцией

class RefinedAbstraction : Abstraction

{

public override void Operation()

{

implementor.Operation();

}

}

/// ConcreteImplementor - конкретный реализатор

/// содержит конкретную реализацию интерфейса

class ConcreteImplementorA : Implementor

{

public override void Operation()

{

Console.WriteLine("ConcreteImplementorA Operation");

}

}

// "ConcreteImplementorB"

class ConcreteImplementorB : Implementor

{

public override void Operation()

{

Console.WriteLine("ConcreteImplementorB Operation");

}

}

}

Доп. Инфа: http://habrahabr.ru/post/85137/