Template Method Pattern

  • warning: array_fill(): Number of elements must be positive in /var/www/vhosts/benjaminradtke.com/httpdocs/includes/database.inc on line 253.
  • warning: implode(): Invalid arguments passed in /var/www/vhosts/benjaminradtke.com/httpdocs/includes/database.inc on line 253.
  • warning: array_keys() expects parameter 1 to be array, null given in /var/www/vhosts/benjaminradtke.com/httpdocs/modules/user/user.module on line 528.
  • user warning: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ')' at line 1 query: SELECT p.perm FROM role r INNER JOIN permission p ON p.rid = r.rid WHERE r.rid IN () in /var/www/vhosts/benjaminradtke.com/httpdocs/modules/user/user.module on line 528.
Your rating: None Average: 1 (2 votes)

Das Template Method Pattern hat nichts mit Templates im üblichen Sinne zu tun, soviel vorne weg. Es schreibt vielmehr den Ablauf eines Algorithmus vor, ohne dessen einzelne Komponenten zu implementieren. Die Bestandteile werden lediglich bedingt und in ihrer Reihenfolge festgelegt, können jedoch beliebig in den erbenden Klassen umgesetzt werden.

  1. abstract class AbstractFoo {
  2.  
  3. final public function execute() {
  4.  
  5. $this->init();
  6. $this->dispatch();
  7. $this->run()
  8. ? $this->output()
  9. : $this->setError();
  10. }
  11. }
  12.  
  13. abstract protected function init();
  14.  
  15. abstract protected function dispatch();
  16.  
  17. abstract protected function run();
  18.  
  19. abstract protected function output();
  20.  
  21. abstract protected function setError();
  22. }

Die Klasse AbstractFoo ist als abstract deklariert, was dazu führt, dass sie nicht ohne vererbt zu werden instanziert werden kann. Die einzige öffentliche Methode execute() beinhaltet den logischen Ablauf der weiteren Methoden und ist als final deklariert um das Überschreiben dieser Methode zu unterbinden. Die einzelnen Bestandteile sind in dieser Klasse jedoch nicht konkret implementiert, sondern als abstrakte Methoden angelegt. Daraus resultiert, dass eine erbende Klasse die konkreten Implementierungen der Methoden übernehemen muss.

  1. class ConcreteFoo extends AbstractFoo {
  2.  
  3. public function init() {
  4. // konkrete Implementierung für init()
  5. }
  6.  
  7. public function dispatch() {
  8. // konkrete Implementierung für dispatch()
  9. }
  10.  
  11. public function run() {
  12. // konkrete Implementierung für run()
  13. }
  14.  
  15. public function output() {
  16. // konkrete Implementierung für output()
  17. }
  18.  
  19. public function setError() {
  20. // konkrete Implementierung für setError()
  21. }
  22. }

Eine erbende Klasse bekommt somit den eigentlichen (nicht überschreibbaren) Algorithmus "aufgedrückt" und ist dafür verantwortlich dessen Bestandteile konkret umzusetzen.

levitra kaufen

Tags