НОВОРІЧНИЙ РОЗПРОДАЖ!
Міст

Міст на Ruby

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

Одна з цих ієрархій (абстракція) отримає посилання на об’єкти іншої ієрархії (реалізація) і буде делегувати їм основну роботу. Завдяки тому, що всі реалізації будуть дотримуватись спільного інтерфейсу, їх можна буде взаємозамінювати всередині абстракції.

Складність:

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

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

Ознаки застосування патерна: Якщо в програмі чітко виділено класи «керування» та кілька видів класів «платформ», а керуючі об’єкти делегують виконання платформам, тоді можна сказати, що ви застосовуєте Міст.

Концептуальний приклад

Цей приклад показує структуру патерна Міст, а саме — з яких класів він складається, які ролі ці класи виконують і як вони взаємодіють один з одним.

main.rb: Приклад структури патерна

# The Abstraction defines the interface for the "control" part of the two class # hierarchies. It maintains a reference to an object of the Implementation # hierarchy and delegates all of the real work to this object. 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 # You can extend the Abstraction without changing the Implementation classes. class ExtendedAbstraction < Abstraction # @return [String] def operation "ExtendedAbstraction: Extended operation with:\n"\ "#{@implementation.operation_implementation}" end end # The Implementation defines the interface for all implementation classes. It # doesn't have to match the Abstraction's interface. In fact, the two interfaces # can be entirely different. Typically the Implementation interface provides # only primitive operations, while the Abstraction defines higher-level # operations based on those primitives. class Implementation # @abstract # # @return [String] def operation_implementation raise NotImplementedError, "#{self.class} has not implemented method '#{__method__}'" end end # Each Concrete Implementation corresponds to a specific platform and implements # the Implementation interface using that platform's 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 # Except for the initialization phase, where an Abstraction object gets linked # with a specific Implementation object, the client code should only depend on # the Abstraction class. This way the client code can support any abstraction- # implementation combination. def client_code(abstraction) # ... print abstraction.operation # ... end # The client code should be able to work with any pre-configured abstraction- # implementation combination. 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