ホームページ >バックエンド開発 >PHPチュートリアル >PHPデザインパターンのテンプレートメソッドパターンを1つの記事で理解する

PHPデザインパターンのテンプレートメソッドパターンを1つの記事で理解する

齐天大圣
齐天大圣オリジナル
2020-08-06 17:02:392021ブラウズ

テンプレート メソッド パターンは、一般的に使用される設計パターンでもあり、動作設計パターンです。その定義は、メソッド内でアルゴリズムのスケルトンを定義し、一部のステップをサブクラスに延期することです。テンプレート メソッドを使用すると、アルゴリズムの構造を変更せずに、サブクラスでアルゴリズムの特定のステップを再定義できます。

シナリオ

普段、週末は遅く起きるので、朝食を買いに出かけません。バケツを作るだけかもしれませんインスタントラーメンや酸辣湯麺、麺類や淮南牛肉湯など。インスタントラーメンや酸辣湯麺の浸し方も同様で、まず熱湯を用意し、その中にインスタントラーメンや酸辣湯麺を浸し、その後お好みの調味料パックを加えて浸け置きします。 2~3分。まったく同じステップが 2 つあり (熱湯を準備し、2 ~ 3 分間浸す)、類似​​したステップが 2 つあります (材料を浸し、それぞれの調味料パックを追加します)。

上記のシナリオでは、インスタント ラーメンや酸辣湯麺を浸すためのアルゴリズムを定義できます。このアルゴリズムは非常にシンプルで、次の 4 ステップです。

  • 熱湯を準備します

  • 食材(インスタントラーメンまたは酸辣湯麺)を浸します

  • 調味料を加える(インスタントラーメンと酸辣湯麺には専用の調味料が入っています)

  • 沸騰したお湯に2~3分浸します

ここで、テンプレート メソッド パターンを使用して上記の要件を満たします。

まず、特定のアルゴリズムと各ステップを定義する抽象クラスを定義します。

abstract class Breakfast
{
    final public function prepare () {
        $this->boilWater();
        $this->brew();
        $this->addSeasoning();  
        $this->wait();
    }
    
    public function boilWater ()
    {
        echo '准备开水' . PHP_EOL;
    }
    
    // 泡食材
    abstract public function brew ();
    
    // 加调料
    abstract public function addSeasoning ();
    
    public function wait ()
    {
        echo '等待2~3分钟' . PHP_EOL;
    }
}

prepare メソッドには特定のアルゴリズムが含まれています。このメソッドに Final を追加すると、メソッドがオーバーライドされなくなります。さらに、ここには 2 つの抽象メソッドがあり、将来の世代によって完成される必要があることがわかります。

次に、インスタントラーメンと酸辣湯麺のカテゴリーを完成させましょう。これら 2 つのクラスは、Breakfast を継承してから抽象メソッドを完成させる必要があります。

class Noodle extends Breakfast
{
    public function brew ()
    {
        echo '加入方便面' . PHP_EOL;
    }
    public function addSeasoning ()
    {
        echo '加入方便面的调料包' . PHP_EOL;
    }
}

class Powder extends Breakfast
{
    public function brew ()
    {
        echo '加入酸辣粉' . PHP_EOL;
    }
    public function addSeasoning ()
    {
        echo '加入酸辣粉的调料包' . PHP_EOL;
    }
}

上記の例は、典型的なテンプレート メソッド パターンです。アルゴリズムのスケルトンは親クラスで定義され、サブクラスはアルゴリズムのいくつかのステップを完了します。

#フック

上記の例は、テンプレート メソッド パターンの一般的なシナリオ、つまり再利用を反映しています。再利用に加えて、テンプレート メソッド パターンも重要なアプリケーション拡張です。

テンプレート メソッド パターンはフックを通じて拡張されます。フックは抽象クラスで宣言されたメソッドですが、実装は空またはデフォルトです。フックの存在により、サブクラスはアルゴリズムのさまざまなポイントをフックできるようになります。それをフックするかどうかはサブクラスによって決定されます。

続いてフックの使い方を例に挙げて説明していきますが、私はインスタントラーメンを食べるときにハムや卵を加えます。ハムと卵を追加するかどうかは不確実なので、これをフックして、ハムと卵のどちらを追加するかをサブクラスに決定させることができます。

Breakfast.phpを変更する

abstract class Breakfast
{
    final public function prepare () {
        $this->boilWater();
        $this->brew();
        $this->addSeasoning();
        $this->hook();
        $this->wait();
    }
    
    
    // 省略部分方法
    
    
    // 默认不做任何事情
    public function hook () :void
    {}
}

Noodle.phpを変更してフックメソッドを書き直す

public function hook(): void
{
    echo '加入火腿和鸡蛋' . PHP_EOL;
}

#テンプレートメソッドパターンとコールバック関数PHP には、並べ替えアルゴリズムをカプセル化する sort() 関数など、テンプレート メソッド パターンや戦略パターンに似たアイデアを使用する関数が多数ありますが、特定の並べ替えルールはコールバック関数。コールバック関数を使用すると、抽象クラスやサブクラスを作成する必要がなくなり、コード量が大幅に削減されます。

#テンプレート メソッド パターン、ファクトリ メソッド パターン、ストラテジ パターンの関係

ファクトリ メソッド パターンは、テンプレート メソッド パターンの特殊な形式です。 。

テンプレート メソッドは継承メカニズムに基づいており、サブクラスのコンテンツの一部を拡張することでアルゴリズムの一部を変更できます。

戦略パターンは組み合わせメカニズムに基づいています。対応する動作にさまざまな戦略を提供することで、オブジェクトの動作の一部を変更できます。

テンプレート メソッドはクラス レベルで動作するため、静的です。ポリシーはオブジェクト レベルで動作するため、実行時に動作を切り替えることができます。

以上がPHPデザインパターンのテンプレートメソッドパターンを1つの記事で理解するの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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