Блог


Паттерны в PHP (Facade)

На мой взгляд этот паттерн зря называют фасадом. Дело в том, что в русском языке он довольно прочно ассоциируется с постройками, с лицевой стороной здания. Но суть паттерна несколько другая. Это скорее больше похоже на пульт управления умным домом, если уж рассматривать его с точки зрения домохозяйств. 

Допустим у вас дома есть кофемашина, телевизор и электрический тазик ноги парить. Жена моя недавно себе купила. Улыбаюсь

Вот теперь представьте, что приходите вечером с работы домой. Уставший. А тут на тебе: нужно включить кофемашину, выбрать режим "руссиано", включить телевизор, найти канал с футболом, включить тазик, выбрать режим массажера с подогревом. И тогда наступит долгожданная лафа. В руке ароматный кофе, наши забили гол, ноги в тазике.

Но если у вас есть система умного дома, то можно заранее все это настроить, и запустить одной кнопкой. Даже издалека, по мобиле.

Вот так же работает паттерн "фасад".  В кодовом примере можно выразить так.
Имеем три устройства, делающих жизнь приятной:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
<?php 
// Кофемашина
class CoffeeMachine
{
    public function 
cappuccino()
    {
        return 
'Cappuccino';
    }
    
    public function 
russiano()
    {
        return 
'Russiano';
    }
}

// Телевизор
class TV
{
    protected 
$channels = [
        
=> '1tv',
        
=> 'RenTv',
        
=> 'MatchTv'
    
];

    public function 
сhannelSelector($num)
    {
        return 
$this->channels[$num];
    }
}

// Тазик, ноги парить.
class FootMassager
{
    public function 
addColdWater()
    {
        return 
'холодная вода';
    }
    
    public function 
addHotWater()
    {
        return 
'горячая вода';
    }
}

 



Настраиваем умный дом на определенные с ними действия;

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23

// Этот класс построен по принципу патерна Facade
class SmartHouse
{
    public function 
__construct($cofeeMachine$TV$footMassager)
    {
        
$this->cofeeMachine $cofeeMachine;
        
$this->TV $TV;
        
$this->footMassager $footMassager;
    }
    
    public function 
sweetHome()
    {   
// Вызываем нужные методы из разных классов
        
$cofee $this->cofeeMachine->russiano();
        
$football $this->TV->сhannelSelector(3);
        
$water $this->footMassager->addHotWater();
        
// Жизнь удалась.
        
return 'Хлебнуть '$cofee 
              
.', посмотреть '$football 
              
.', сунуть ноги в тазик, где '$water;
    }
}



 



А теперь запускаем все одной кнопкой (вызвав один метод) из фасада (системы умного дома) 

1
2
3
4
5
6
7
8
9
10
11

    
// Гаджеты
    
$cofeeMachine = new CoffeeMachine;
    
$TV = new TV;
    
$footMassager = new FootMassager;
    
    
// Умный дом 
    
$smartHouse = new SmartHouse($cofeeMachine$TV$footMassager);
    
// Запускаем программу действий одним движением.
    
echo $smartHouse->sweetHome();


 


Если вы знакомы с паттерном "декоратор", то могли заметить, что фасад, это его антипод. То есть почти наоборот. Декоратор добавляет методы одного класса в другой, а фасад выбирает нужные методы из разных классов.

Что еще нужно знать о фасаде.
Первое, он никоем образом не ограничевает прямого доступа к классам. Это помощник, а не ограничитель.
Второе - он не управляет системой в целом, только необходимой частью. Если нужна одна точка управления всей системой, нужно применить паттерн фронт-контроллер (Front controller).
Третье. В классе, построенному по этому паттерну, не должно быть команды new.  Если велик соблазн инициализировать объект внутри фасада, лучше посмотреть в сторону семейства порождающих паттернов.


Теги: Паттерны | PHP

Комментарии (0)


 
Наверх