НОВОГОДНЯЯ РАСПРОДАЖА!
Мост

Мост на Ruby

Мост — это структурный паттерн, который разделяет бизнес-логику или большой класс на несколько отдельных иерархий, которые потом можно развивать отдельно друг от друга.

Одна из этих иерархий (абстракция) получит ссылку на объекты другой иерархии (реализация) и будет делегировать им основную работу. Благодаря тому, что все реализации будут следовать общему интерфейсу, их можно будет взаимозаменять внутри абстракции.

Сложность:

Популярность:

Применимость: Паттерн Мост особенно полезен когда вам приходится делать кросс-платформенные приложения, поддерживать несколько типов баз данных или работать с разными поставщиками похожего API (например, cloud-сервисы, социальные сети и т. д.)

Признаки применения паттерна: Если в программе чётко выделены классы «управления» и несколько видов классов «платформ», причём управляющие объекты делегируют выполнение платформам, то можно сказать, что у вас используется Мост.

Концептуальный пример

Этот пример показывает структуру паттерна Мост, а именно — из каких классов он состоит, какие роли эти классы выполняют и как они взаимодействуют друг с другом.

main.rb: Пример структуры паттерна

# Абстракция устанавливает интерфейс для «управляющей» части двух иерархий # классов. Она содержит ссылку на объект из иерархии Реализации и делегирует ему # всю настоящую работу. class Abstraction # @param [Implementation] implementation def initialize(implementation) @implementation = implementation end # @return [String] def operation "Abstraction: Base operation with:\n"\ "#{@implementation.operation_implementation}" end end # Можно расширить Абстракцию без изменения классов Реализации. class ExtendedAbstraction < Abstraction # @return [String] def operation "ExtendedAbstraction: Extended operation with:\n"\ "#{@implementation.operation_implementation}" end end # Реализация устанавливает интерфейс для всех классов реализации. Он не должен # соответствовать интерфейсу Абстракции. На практике оба интерфейса могут быть # совершенно разными. Как правило, интерфейс Реализации предоставляет только # примитивные операции, в то время как Абстракция определяет операции более # высокого уровня, основанные на этих примитивах. # # @abstract class Implementation # @abstract # # @return [String] def operation_implementation raise NotImplementedError, "#{self.class} has not implemented method '#{__method__}'" end end # Каждая Конкретная Реализация соответствует определённой платформе и реализует # интерфейс Реализации с использованием API этой платформы. class ConcreteImplementationA < Implementation # @return [String] def operation_implementation 'ConcreteImplementationA: Here\'s the result on the platform A.' end end class ConcreteImplementationB < Implementation # @return [String] def operation_implementation 'ConcreteImplementationB: Here\'s the result on the platform B.' end end # За исключением этапа инициализации, когда объект Абстракции связывается с # определённым объектом Реализации, клиентский код должен зависеть только от # класса Абстракции. Таким образом, клиентский код может поддерживать любую # комбинацию абстракции и реализации. # # @param [Abstraction] abstraction def client_code(abstraction) # ... print abstraction.operation # ... end # Клиентский код должен работать с любой предварительно сконфигурированной # комбинацией абстракции и реализации. implementation = ConcreteImplementationA.new abstraction = Abstraction.new(implementation) client_code(abstraction) puts "\n\n" implementation = ConcreteImplementationB.new abstraction = ExtendedAbstraction.new(implementation) client_code(abstraction) 

output.txt: Результат выполнения

Abstraction: Base operation with: ConcreteImplementationA: Here's the result on the platform A. ExtendedAbstraction: Extended operation with: ConcreteImplementationB: Here's the result on the platform B. 

Мост на других языках программирования

Мост на C# Мост на C++ Мост на Go Мост на Java Мост на PHP Мост на Python Мост на Rust Мост на Swift Мост на TypeScript