Что такое шаблон проектирования фасада?
1 марта 2023 г.По мере увеличения размера и сложности приложений управление взаимозависимостью между подсистемами может стать сложной задачей. Шаблон оформления фасада упрощает это взаимодействие и предоставляет унифицированный интерфейс для набора интерфейсов в подсистеме.
Случай использования
Рассмотрите приложение для онлайн-покупок, которое позволяет покупателям просматривать товары, добавлять их в корзину и оформлять заказ. Приложение имеет различные подсистемы, отвечающие за управление другими частями, такими как системы инвентаризации, оплаты и доставки. Эти подсистемы имеют разные интерфейсы и должны взаимодействовать друг с другом для совершения покупки.
Проблема в том, что управление этой связью между подсистемами может быть затруднено по мере роста приложения. Изменения в одной подсистеме могут иметь каскадный эффект на другие подсистемы, что приводит к запутанной и сложной в обслуживании кодовой базе.
Мы можем использовать шаблон проектирования фасада, чтобы упростить взаимодействие между подсистемами. Шаблон фасада обеспечивает единую точку входа в подсистему, скрывая ее сложность от клиента. В нашем примере мы можем создать фасад, предоставляющий унифицированный интерфейс для подсистем инвентаризации, оплаты и доставки.
Предпосылки
- Базовые знания концепций ООП.
 - Любое знание языков программирования.
 
В статье демонстрируются шаблоны проектирования Facade с использованием языка программирования C#.
Цели обучения
- Как писать код с использованием шаблона проектирования Facade
 
Начало работы
Начнем с определения интерфейсов для наших подсистем
public interface IInventorySystem
{
    void Update(int productId, int quantity);
    bool IsAvailable(int productId, int quantity);
}
public interface IPaymentSystem
{
    bool Charge(double amount);
}
public interface IShippingSystem
{
    bool Ship(string address);
}
Далее мы можем реализовать подсистемы:
public class InventorySystem : IInventorySystem
{
    public void Update(int productId, int quantity)
    {
        // update inventory
    }
    public bool IsAvailable(int productId, int quantity)
    {
        // check if inventory is available
        return true;
    }
}
public class PaymentSystem : IPaymentSystem
{
    public bool Charge(double amount)
    {
        // charge the customer
        return true;
    }
}
public class ShippingSystem : IShippingSystem
{
    public bool Ship(string address)
    {
        // ship the product
        return true;
    }
}
Наконец, мы можем создать фасад, обеспечивающий простой интерфейс для этих подсистем:
public class OrderFacade
{
    private IInventorySystem _inventorySystem;
    private IPaymentSystem _paymentSystem;
    private IShippingSystem _shippingSystem;
    public OrderFacade()
    {
        _inventorySystem = new InventorySystem();
        _paymentSystem = new PaymentSystem();
        _shippingSystem = new ShippingSystem();
    }
    public bool PlaceOrder(int productId, int quantity, double amount, string address)
    {
        bool success = true;
        if (_inventorySystem.IsAvailable(productId, quantity))
        {
            _inventorySystem.Update(productId, -quantity);
            success = success && _paymentSystem.Charge(amount);
            success = success && _shippingSystem.Ship(address);
        }
        else
        {
            success = false;
        }
        return success;
    }
}
В классе OrderFacade мы создаем экземпляры подсистем и предлагаем простой метод PlaceOrder, который принимает идентификатор продукта, количество, сумму и адрес доставки. Метод PlaceOrder использует подсистемы для проверки запасов, выставления счетов покупателю и отправки товара.
С шаблоном фасада клиентский код может создать экземпляр класса OrderFacade и вызвать метод PlaceOrder, не беспокоясь о деталях подсистем.
var order = new OrderFacade();
bool success;
// place an order
success = order.PlaceOrder(productId: 123, quantity: 1, amount: 99.99, address: "123 Main St");
if (success)
{
Console.WriteLine("Order placed successfully");
}
else
{
Console.WriteLine("Unable to place order");
}
В этом примере мы использовали шаблон фасада, чтобы упростить взаимодействие между подсистемами в приложении для онлайн-покупок. Код клиента должен взаимодействовать только с классом `OrderFacade`, и ему не нужно знать о подсистемах инвентаризации, оплаты и доставки.
Заключение
Шаблон проектирования фасада упрощает взаимодействие между подсистемами и предоставляет унифицированный интерфейс для набора интерфейсов в подсистеме. Это может помочь уменьшить связанность и улучшить ремонтопригодность больших и сложных приложений. В этой статье рассматривается шаблон проектирования фасадов на C# с примерами использования и примерами кода. Используя шаблон фасада, мы можем упростить кодовую базу и упростить ее поддержку и расширение.
Спасибо за прочтение, и я надеюсь, что вам понравилась статья. Оставьте свой отзыв в разделе комментариев.
Подпишитесь на меня
Публикация C#, Dev. в, Pinterest, Подстек, Hashnode, Write.as< /а>
Другие шаблоны проектирования — Ссылка на обучение Linkedin
n Также опубликовано здесь
Оригинал