🎉 Ура! После трёх лет работы, я наконец выпустил английскую версию книги о паттернах! Вот она »

C#: Мост

Bridge Мост Bridge

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

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

Подробней о Мосте

Особенности паттерна на C#

Сложность:

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

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

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

Пример: Структура паттерна

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

Program.cs: Пример структуры паттерна

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace RefactoringGuru.DesignPatterns.Bridge.Structural
{
    abstract class Abstraction
    {
        protected Implementor implementor;
		
        public Implementor Implementor
        {
            set { implementor = value; }
        }
		
        public Abstraction(Implementor imp)
        {
            implementor = imp;
        }
		
        public virtual string Operation()
        {
            return "Abstract: Base operation with:\n" +  implementor.operationImplementation();
        }
    }

    abstract class Implementor
    {
        public abstract string operationImplementation();
    }

    class ExtendedAbstraction : Abstraction
    {
        public ExtendedAbstraction(Implementor imp) : base(imp)
        { 
		}
		
        public override string Operation()
        {
            return "ExtendedAbstraction: Extended operation with:\n" + base.implementor.operationImplementation();
        }
    }

    class ConcreteImplementorA : Implementor
    {
        public override string operationImplementation()
        {
            return "ConcreteImplementationA: The result in platform A.\n";
        }
    }

    class ConcreteImplementorB : Implementor
    {
        public override string operationImplementation()
        {
            return "ConcreteImplementationA: The result in platform B.\n";
        }
    }
	
	class Program
    {
        static void Main(string[] args)
        {
            Client client = new Client();

            Abstraction abstraction;
            abstraction = new ExtendedAbstraction(new ConcreteImplementorA());
            client.ClientCode(abstraction);
            abstraction.Implementor = new ConcreteImplementorB();
            client.ClientCode(abstraction);
        }
    }

    class Client
    {
        public void ClientCode(Abstraction abstraction)
        {
            Console.WriteLine(abstraction.Operation());
        }
    }
}

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

ExtendedAbstraction: Extended operation with:
ConcreteImplementationA: The result in platform A.

ExtendedAbstraction: Extended operation with:
ConcreteImplementationA: The result in platform B.