ホームページ > バックエンド開発 > PHPチュートリアル > PHP のテンプレート メソッド パターンの詳細な分析

PHP のテンプレート メソッド パターンの詳細な分析

青灯夜游
リリース: 2023-04-10 11:50:02
転載
2315 人が閲覧しました

前回の記事「PHPのファサードパターンを1記事で理解する」ではPHPのファサードパターンについて紹介しましたが、この記事ではPHPのデザインパターンにおけるテンプレートメソッドのパターンについて理解していきます。

PHP のテンプレート メソッド パターンの詳細な分析

テンプレート メソッド パターンも、うっかり使用してしまうことが多いパターンの 1 つです。このモデルは、継承の最良の解釈です。サブクラス内に繰り返しアクションがある場合、それを抽出して親クラスに配置して統一処理する、これがテンプレートメソッドのパターンの最もシンプルで一般的な説明です。私たちが通常プロジェクトを行うときと同じように、研究、開発、テスト、展開、オンラインプロセスなど、各プロジェクトのプロセスは実際には同じです。各プロジェクトで、これらのプロセスの実装はまったく同じではありません。このプロセスはテンプレートメソッドのようなもので、毎回このプロセスに従って開発することができます。

Gof クラス図と説明

GoF 定義: 一部のステップをサブクラスに延期しながら、操作内のアルゴリズムのスケルトンを定義します。 TemplateMethod を使用すると、アルゴリズムの構造を変更せずに、サブクラスでアルゴリズムの特定のステップを再定義できます。

#GoF クラス図

PHP のテンプレート メソッド パターンの詳細な分析

##コード実装

abstract class AbstractClass
{
    public function TemplateMethod()
    {
        $this->PrimitiveOperation1();
        $this->PrimitiveOperation2();
    }

    abstract public function PrimitiveOperation1();
    abstract public function PrimitiveOperation2();
}
ログイン後にコピー
テンプレート メソッド TemplateMethod() を使用して抽象クラスを定義し、その中でアルゴリズム操作メソッドを呼び出します。これらのアルゴリズム抽象メソッドはサブクラスに実装されます。

class ConcreteClassA extends AbstractClass
{
    public function PrimitiveOperation1()
    {
        echo '具体类A实现方法1', PHP_EOL;
    }
    public function PrimitiveOperation2()
    {
        echo '具体类A实现方法2', PHP_EOL;
    }
}

class ConcreteClassB extends AbstractClass
{
    public function PrimitiveOperation1()
    {
        echo '具体类B实现方法1', PHP_EOL;
    }
    public function PrimitiveOperation2()
    {
        echo '具体类B实现方法2', PHP_EOL;
    }
}
ログイン後にコピー

特定の実装クラス。親クラスで定義されたアルゴリズムを実装するだけで済みます。

$c = new ConcreteClassA();
$c->TemplateMethod();

$c = new ConcreteClassB();
$c->TemplateMethod();
ログイン後にコピー

クライアント呼び出しでは、サブクラスがインスタンス化されますが、サブクラスによって継承された親クラスのテンプレート メソッドが呼び出されます。統一されたアルゴリズム呼び出しを実現できます。

オブジェクト指向開発を行ったことがある人なら誰でも、ある程度テンプレート メソッド パターンを使用したことがあると思います。これは非常に一般的なためです。
  • 一部のフレームワークでは、多くの場合、一部の関数クラスに初期化関数があり、他の多くの内部関数が初期化関数で呼び出されます。これは実際にはテンプレート メソッド パターンの適用です
  • テンプレート メソッド パターンはフック関数を簡単に実装できます。オープンソース システムで用意されている多くのテンプレートやフック関数と同様です。たとえば、一部のブログ オープン ソース プログラムでは、ユーザーがオンデマンドで実装できるように、特別な場所に広告スペースやフック関数を予約します。
  • テンプレート メソッド パターンは、アルゴリズムの変更されていない部分を一度に実装する場合に適しています。 、変数部分はサブクラスに実装を任せる; サブクラス内の共通の動作は抽出されて親クラスに集約される; サブクラスの拡張は制御される;
  • このモデルは、「 」と呼ばれるものを具体化しています。ハリウッドの法則」 原則は「私たちに来るな、私たちがあなたのところに来る」です。プロジェクト管理 たとえそれがどれほど悪くても、当社のような短期的でフラットで速い企業にはアジャイルの方が適しているというだけのことです。アジャイルでは、実際にはテンプレートである Scurm フレームワークを使用します。ここでは、4 つのタイプの会議、3 つのタイプの人々、および 3 つのツールが定義されています。各プロジェクトの具体的な実施においては、これらのルールを遵守しますが、具体的な実施は同じではありません。たとえば、週に 1 回繰り返す場合もあれば、月に 1 回繰り返す場合もあります。振り返り会議が必要ない場合もありますが、振り返り会議と反省会を一緒に開催します。何があってもScurmをベースに柔軟なプロジェクト開発を行っていきます。リーダーとしては、プロジェクトごとに Scrum の基本プロセスを呼び出すだけで済みます。したがって、会社の強みは全員の学習と切り離すことができません。 !
  • #完全なコード: https://github.com/zhangyue0503/designpatterns-php/blob/master/20.template-method/source/template-method.php

テキスト メッセージは不要です。今回は Cache クラスの初期化部分を実装します。前述したいくつかのフレームワークのツール クラスと同様です。通常、Cache の実装には Memcached または Redis を使用するため、パブリックな Cache クラスを抽出し、Memcached と Redis の Cache 実装クラスにそれを継承させます。パブリック クラスでは、実装クラスの一部の初期化作業がテンプレート メソッドを通じて実行されます。これらのタスクは親クラスによって一律に呼び出されます。実装クラスは各ステップの特定の内容を実装するだけで済みます。

キャッシュ クラス図

完全なソース コード: https://github.com/zhangyue0503/designpatterns-php / blob/master/20.template-method/source/template-method-cache.php

<?php

abstract class Cache
{
    private $config;
    private $conn;

    public function __construct()
    {
        $this->init();
    }
    public function init()
    {
        $this->GetConfig();
        $this->OpenConnection();
        $this->CheckConnection();
    }

    abstract public function GetConfig();
    abstract public function OpenConnection();
    abstract public function CheckConnection();
}

class MemcachedCache extends Cache
{
    public function GetConfig()
    {
        echo &#39;获取Memcached配置文件!&#39;, PHP_EOL;
        $this->config = &#39;memcached&#39;;
    }
    public function OpenConnection()
    {
        echo &#39;链接memcached!&#39;, PHP_EOL;
        $this->conn = 1;
    }
    public function CheckConnection()
    {
        if ($this->conn) {
            echo &#39;Memcached连接成功!&#39;, PHP_EOL;
        } else {
            echo &#39;Memcached连接失败,请检查配置项!&#39;, PHP_EOL;
        }
    }
}

class RedisCache extends Cache
{
    public function GetConfig()
    {
        echo &#39;获取Redis配置文件!&#39;, PHP_EOL;
        $this->config = &#39;redis&#39;;
    }
    public function OpenConnection()
    {
        echo &#39;链接redis!&#39;, PHP_EOL;
        $this->conn = 0;
    }
    public function CheckConnection()
    {
        if ($this->conn) {
            echo &#39;Redis连接成功!&#39;, PHP_EOL;
        } else {
            echo &#39;Redis连接失败,请检查配置项!&#39;, PHP_EOL;
        }
    }
}

$m = new MemcachedCache();

$r = new RedisCache();
ログイン後にコピー

PHP のテンプレート メソッド パターンの詳細な分析Description

  • このような単純なキャッシュ クラスを実装しました。それは多くのフレームワークのコードと非常に似ていますか?
  • サブクラスは独自の実装を定義するだけでよく、繰り返されるコードの残りは親クラスに任せられます。親クラスがない場合は、すべてのサブクラスが自分で init() メソッドを実装する必要があります。
  • もちろん、他の実装クラスを追加する必要がある場合は、この Cache 親クラスを継承して独自の実装を完了するだけで済みます。クライアントは、最初に初期化を呼び出すだけでよいことがわかっているため、これらの実装クラスに非常に簡単に対処できます。どの実装クラスであっても、メソッドはこのクラスを使用できます。これは同じです。
元のアドレス: https://juejin.cn/post/6844903989348139021

著者:ハードコアプロジェクトマネージャー

推奨学習:「

PHPビデオチュートリアル

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

ソース:juejin.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート