🎉 Ура! Після трьох років роботи, я нарешті випустив англійську версію книжки про патерни! Ось вона »

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.