Шаблон Facade

Проблема:

Как по мне, так многие пользовались шаблоном Facade, но они не подозревали об этом. Главная задача этого шаблона это создание единственной точки входа в клиентском коде. Попробую обьяснить, что я имею ввиду. К примеру, у вас есть ряд работающего процедурного кода связанного с парсингом txt-файла, в котором находится информация о продуктах,  и для того, что бы найти и вывести информацию об определенном товаре, вам понадобится написать, к примеру, такой код:

function get_products_line($file_name) {
    // Код по обработке xml
}

function get_product_id_from_line($line) {
    // Поиск ID продукта в строке
}

function get_product_name_from_line($line) {
    // Поиск имени продукта в строке
}
......
// Код который нужно вызвать
   $lines = get_products_line('products.txt');
   $products_info = [];
   foreach($lines as $line) {
      $id = get_product_id_from_line($line);
      $name = get_product_name_from_line($line);
      $products_info[$id] = $name;
   }

И этот код вам нужно будет вызывать каждый раз когда вам понадобится что-то подобное. Ваша система будет очень завязанная на этом коде и далее ее поддержка будет очень сложной, особенно когда ваша система будет розростатся все больше и больше. По этому для решения этой проблемы был придуман шаблон Facade.

Решение:

Создать класс, который будет делать все то же, что и процедурный код, который вызывается конечным пользователем, тоесть программистом, но только клиентский код будет выглядеть проще и будет иметь одну точку входа.

Вот пример:

class ProductFacade {
   private $products = [];
   private $file;
   
   public function __construct($file) {
      $this->file = $file;
      $this->make();
   }

   private function make () {
      $lines = get_products_line( $this->file);
      foreach($lines as $line) {
         $id = get_product_id_from_line($line);
         $name = get_product_name_from_line($line);
         $this->products[$id] = $name;
      }
   }

   // Other code
}

// Удобный и четаемый код с использованием шаблона Facade
$facade = new ProductFacade('products.txt');
// И т.д.

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

LikeMe: