
В этом видео мы с вами разберем паттерн facade. Это очень часто используемый паттерн. Он заключается в том, чтобы создать простой интерфейс к большой и сложной части кода, чтобы спрятать его сложность.
То есть вместо того, чтобы знать все о сложной части, мы знаем только пару методов, которые будут делать, что нам нужно, с сложной частью и мы не будем знать, что там происходит внутри вообще. Это и есть фасад.
Давайте с вами напишем пример паттерна facade.
Допустим у нас есть несколько источников данных о человеке. Это банк, кредитная история и баланс его аккаунта. Давайте создадим их сейчас.
class Bank {
verify (amount) {
return amount < 999
}
}
Мы создали класс Bank, у которого есть метод verify, который проверяет можно ли дать кредит или нет. И в зависимости от суммы мы возвращаем true или false. Конечно, мы пишем сильно упрощенную логику. В реальности мы бы передавали туда юзера и проверяли бы его данные, перед тем, как решать давать кредит или нет.
Теперь давайте добавим класс кредитной истории.
class CreditHistory {
check (name) {
return true
}
}
Этот класс у нас проверяет хорошая ли у нашего юзера кредитная история. И внутри тоже может быть достаточно сложная логика, но для простоты мы просто вернем true, что означает что у любого юзера хорошая кредитная история.
И класс проверки баланса, где будет метод, который говорит положительный ли у нас баланс или отрицательный.
class Balance {
check (name) {
return true
}
}
Теперь мы хотим получить результат по кредиту в виде сообщения. И, чтобы не писать каждый раз логику работы с тремя классами сразу и все проверки, мы можем создать дополнительный класс, который будет фасадом и будет давать нам простое API для получения результата по кредиту.
Мы хотим, чтобы его можно быть использовать в таком виде.
const credit = new Credit('John')
const creditSmall = credit.applyFor(99)
const creditMedium = credit.applyFor(199)
const creditLarge = credit.applyFor(99999)
console.log('creditSmall', creditSmall)
console.log('creditMedium', creditMedium)
console.log('creditLarge', creditLarge)
То есть, мы создаем новый экземпляр класса Credit и у него есть метод applyFor, в который мы передаем сумму кредита, которая нам нужна. И результатом будет сообщение.
Как вы видите, если мы создадим такой фасад, то мы сможем легко узнавать результат по кредиту не зная, что именно проверяется внутри и насколько сложная логика там находится. Мы просто вызываем applyFor и получаем результат.
Теперь давайте опишем класс Credit, который и будет нашим фасадом.
class Credit {
constructor (name) {
this.name = name
}
applyFor (amount) {
const isApproved = new Bank().verify(amount)
const bankResult = isApproved ? 'approved' : 'denied'
const isPositiveBalance = new Balance().check(this.name)
const balance = isPositiveBalance ? 'positive balance' : 'negative balance'
const isGoodCreditHistory = new CreditHistory().check(this.name)
const creditHistory = isGoodCreditHistory ? 'good' : 'poor'
return `${this.name} has been ${bankResult} for the ${amount} credit. With a ${creditHistory} credit standing and having a ${balance}`
}
}
В методе applyFor мы создали новые экземпляры классов и вызвали нужные методы, для получения результатов о юзере, кредите и кредитной истории. Потом мы сгенерировали сообщение о результате по кредиту.
Если мы посмотрим в браузер, то мы получили три сообщения, который были сгенерированы в соответствии с нашей логикой.
Какие же плюсы и минусы у этого паттерна? Из плюсов можно отметить, что написав простой интерфейс вокруг кода с ним проще работать и переиспользовать. Но, создавая фасад мы создаем еще одну абстракцию и, возможно, что она не всегда нужна.
Если у вас возникли какие-то вопросы или комментарии, пишите их прямо под этим видео.