Эти два шаблона очень похожи в том, что оба они служат обертками над чем-то .Разница заключается в контексте : фасад стоит над группой подсистем, а шлюз может стоять над любой функциональностью.С этой точки зрения, для меня Фасад является конкретным корпусом Gateway (не напротив).
Фасад применяется, когда мы думаем, что работа с подсистемами сложна или , если мы хотим сгруппировать несколько вызовов подсистем в одно выполнение [метода].Однако это не обязательно означает, что подсистемы недоступны или что они достаточно сложны.Это просто означает, что у нас есть подсистемы.
Шлюз применяется, когда мы хотим обернуть некоторые вещи и представить их по-другому.Шлюз может быть не подсистемой, а просто относительно сложной функциональностью.Gateway - это общий паттерн, который можно рассматривать как основу для Фасада, Прокси и других паттернов.
Если пример все еще необходим для прояснения :
Фасад может рассчитывать кредитоспособность клиента, запрашивая подсистему проверки счетов, подсистему кредитных счетов, подсистему сбережений и подсистему бэк-офиса (наверное, я видел подобный пример в книгах GOF).
class MortgateFacade {
bool IsCreditWorth(string customerName) {
return !_checkingAccSystem.HasNegativeBalance(customerName) && !_creditAccSystem.HasNegativeCredit(customerName) && !_backOfficeSystem.IsInBlackList(customerName);
}
}
Шлюз может запросить таблицу базы данных и вернуть клиента по идентификатору.(Да, это так просто!)
class CustomersGateway {
Customer GetCustomer(int id) {
return _db.ExecuteOne("SELECT TOP 1 FROM CUSTOMERS WHERE CUSTOMER_ID="+id).AsCustomer();
}
}
[Очевидно, это псевдокод]