%Teilweise Erzeugt mit dem LaTeX-Generator: http://latex.sehnot.de

%Schriftgröße, Layout, Papierformat, Art des Dokumentes
\documentclass[10pt,oneside,a4paper]{scrartcl}

%Einstellungen der Seitenränder
\usepackage[left=2cm,right=2cm,top=1.5cm,bottom=1.5cm,includeheadfoot]{geometry}

%neue Rechtschreibung
\usepackage[ngerman]{babel}

%Umlaute ermöglichen
\usepackage[utf8]{inputenc}

%Gesamtseitenzahl
\usepackage{lastpage}

% Kopf- und Fußzeile
\usepackage[automark]{scrpage2}

%Quellcode-Listings
\usepackage{listings}

%Hyperlinks
\usepackage{hyperref}

%Kopfzeile
\ihead{PHP}
\chead{}
\ohead{http://kohnlehome.de/php/template-method.pdf}
\setheadsepline{0.5pt}

%Fußzeile
\setfootsepline{0.5pt}
\ifoot{Franz Kohnle}
\cfoot{Seite \thepage\ von  \pageref{LastPage}}
\ofoot{\today}

\pagestyle{scrheadings}

\begin{document}

% Überschrift 
\begin{center}
\LARGE % Schriftgröße
\bfseries % Fettdruck
\sffamily % Serifenlose Schrift
PHP-Design-Pattern: Template-Method
\end{center}

\section*{Beschreibung}
Die Grundstruktur (Reihenfolge der einzelnen Schritte) eines Algorithmus werden in einer Methode festgelegt. Unterklassen können bzw. müssen einzelne Schritte überschreiben, ohne die Grundstruktur zu verändern.

\section*{Quellcode}
\begin{verbatim}
abstract class TemplateMethod {

    // Die Struktur des Algorithmus kann nicht verändert werden
    final public function templateMethod(){
        step1();
        step2();
        step3();
        step4();
    }

    // Soll fest bleiben
    final private function step1() { ... }

    // Muss überschrieben werden
    abstract protected function step2();
    
    // Hook: leere Implementierung, kann überschrieben werden
    public function step3(){ }

    // Kann überschrieben werden
    public function step4(){ ... }
}
\end{verbatim}

\begin{verbatim}
class ConcreteTemplate extends TemplateMethod {

    protected function step2(){ ... }
    
    protected function step3(){ ... }
    
    protected function step4(){ ... } 
    
}
\end{verbatim}

\end{document}
