Źródło: pl.wikipedia.org/wiki/Metoda_szablonowa_(wzorzec_projektowy)
PRZYKŁAD
Dobrym przykładem będzie użycie wzorca do wyświetlenia szablonu strony internetowej. Struktura dokumentu HTML jest podzielona na sekcje, bloki, które muszą być użyte w odpowiedniej kolejności: nagłówek (header), zawartość (section) i stopka (footer).
Tworzymy abstrakcyjną klasę Template:
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 |
<?php // Template.php abstract class Template { protected $logo; protected $content; protected $copyright; abstract protected function getHeader($logo); abstract protected function getSection($content); abstract protected function getFooter($copyright); public function getTemplate($img, $text, $copy) { $this->logo = $img; $this->content = $text; $this->copyright = $copy; $this->getHeader($this->logo); $this->getSection($this->content); $this->getFooter($this->copyright); } } ?> |
Klasa Template zawiera właściwości, które przekazywane są do abstrakcyjnych metod: getHeader($logo), getSection($content) i getFooter($copyright). Możemy już się domyśleć, że każda z metod ustawi jakąś konkretną zawartość, np: $logo = obrazek lub adres do obrazka. Ponadto, właściwości jak i metody są chronione. Wykorzystuję tutaj walory hermetyzacji 🙂 Oczywiście nie jest to konieczne, ale to dobra praktyka.
Metoda szablonowa getTemplate($img, $text, $copy) pobiera właściwości i ustawia sekwencję wykonywania metod abstrakcyjnych.
Tworzymy klasę OneColumnTpl, która dziedziczy po Template metody abstrakcyjne i nadaje im konkretne implementacje:
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 |
<?php // OneColumnTpl.php class OneColumnTpl extends Template { protected function getHeader($logo) { $this->logo = $logo; echo '<header>'; echo '<img src="'.$this->logo.'" alt="logo" />'; echo '</header>'; } protected function getSection($content) { $this->content = $content; echo '<section>'; echo '<article>'.$this->content.'</article>'; echo '</section>'; } protected function getFooter($copyright) { $this->copyright = $copyright; echo '<footer>'.$this->copyright.'</footer>'; } } ?> |
Na koniec tworzymy klasę klienta – Client i testujemy działanie programu:
1 2 3 4 5 6 7 8 9 10 11 |
<?php // Client.php spl_autoload_register(function ($class_name) { include $class_name . '.php'; }); $logo = 'http://geekster.pl/wp-content/uploads/2018/03/ant-19473.png'; $content = 'Hello World!'; $copyright = 'Copyright © 2019 | geekster.pl'; $site = new OneColumnTpl(); $site->getTemplate($logo, $content, $copyright); ?> |