ホームページ >バックエンド開発 >PHPチュートリアル >PHPでテンプレートメソッドパターンを使用するにはどうすればよいですか?

PHPでテンプレートメソッドパターンを使用するにはどうすればよいですか?

PHPz
PHPzオリジナル
2024-06-04 17:15:00519ブラウズ

テンプレート メソッド パターンはアルゴリズムのスケルトンを定義し、特定のステップはサブクラスによって実装されるため、サブクラスは全体の構造を変更せずに特定のステップをカスタマイズできます。このパターンは次の目的で使用されます。 1. アルゴリズムのスケルトンを定義します。 2. アルゴリズムの特定の動作をサブクラスに延期します。 3. アルゴリズム全体の構造を変更せずに、サブクラスがアルゴリズムの特定のステップをカスタマイズできるようにします。

PHPでテンプレートメソッドパターンを使用するにはどうすればよいですか?

PHP のテンプレート メソッド パターン

はじめに

テンプレート メソッド パターンは、アルゴリズムの骨格を定義する設計パターンであり、特定のステップはサブクラスによって実装されます。これにより、サブクラスはアルゴリズムの全体的な構造を変更することなく、特定のステップをカスタマイズできます。

UML 図

+----------------+
| AbstractClass  |
+----------------+
| + templateMethod() |
+----------------+

+----------------+
| ConcreteClass1  |
+----------------+
| + concreteMethod1() |
+----------------+

+----------------+
| ConcreteClass2  |
+----------------+
| + concreteMethod2() |
+----------------+

コード例

AbstractClass.php

abstract class AbstractClass
{
    public function templateMethod()
    {
        $this->step1();
        $this->step2();
        $this->hookMethod();
    }

    protected abstract function step1();
    protected abstract function step2();
    protected function hookMethod() {}
}

ConcreteClass1.php

class ConcreteClass1 extends AbstractClass
{
    protected function step1()
    {
        echo "ConcreteClass1: Step 1<br>";
    }

    protected function step2()
    {
        echo "ConcreteClass1: Step 2<br>";
    }
}

ConcreteClass2.php

class ConcreteClass2 extends AbstractClass
{
    protected function step1()
    {
        echo "ConcreteClass2: Step 1<br>";
    }

    protected function step2()
    {
        echo "ConcreteClass2: Step 2<br>";
    }

    protected function hookMethod()
    {
        echo "ConcreteClass2: Hook Method<br>";
    }
}

実際的なケース

生徒がいると仮定します。システムを管理するには、「学生リスト」ページと「学生詳細」ページの 2 つのページを作成する必要があります。 2 つのページは同じレイアウトを使用していますが、内容が異なります。

StudentManager.php

class StudentManager
{
    public function showStudentList()
    {
        $students = // 获取学生数据
        $view = new StudentListView();
        $view->setStudents($students);
        $view->render();
    }

    public function showStudentDetail($id)
    {
        $student = // 获取学生数据
        $view = new StudentDetailView();
        $view->setStudent($student);
        $view->render();
    }
}

StudentListView.php

class StudentListView extends AbstractView
{
    private $students;

    public function setStudents($students)
    {
        $this->students = $students;
    }

    public function render()
    {
        $this->showHeader();
        $this->showStudents();
        $this->showFooter();
    }

    protected function showStudents()
    {
        echo "<h1>学生列表</h1>";
        echo "<ul>";
        foreach ($this->students as $student) {
            echo "<li>" . $student->getName() . "</li>";
        }
        echo "</ul>";
    }
}

StudentDetailView.php

class StudentDetailView extends AbstractView
{
    private $student;

    public function setStudent($student)
    {
        $this->student = $student;
    }

    public function render()
    {
        $this->showHeader();
        $this->showStudent();
        $this->showFooter();
    }

    protected function showStudent()
    {
        echo "<h1>学生详情</h1>";
        echo "<p>姓名:" . $this->student->getName() . "</p>";
        echo "<p>年龄:" . $this->student->getAge() . "</p>";
    }
}

以上がPHPでテンプレートメソッドパターンを使用するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。