前回の記事「PHPのファサードパターンを1記事で理解する」ではPHPのファサードパターンについて紹介しましたが、この記事ではPHPのデザインパターンにおけるテンプレートメソッドのパターンについて理解していきます。
テンプレート メソッド パターンも、うっかり使用してしまうことが多いパターンの 1 つです。このモデルは、継承の最良の解釈です。サブクラス内に繰り返しアクションがある場合、それを抽出して親クラスに配置して統一処理する、これがテンプレートメソッドのパターンの最もシンプルで一般的な説明です。私たちが通常プロジェクトを行うときと同じように、研究、開発、テスト、展開、オンラインプロセスなど、各プロジェクトのプロセスは実際には同じです。各プロジェクトで、これらのプロセスの実装はまったく同じではありません。このプロセスはテンプレートメソッドのようなもので、毎回このプロセスに従って開発することができます。
GoF 定義: 一部のステップをサブクラスに延期しながら、操作内のアルゴリズムのスケルトンを定義します。 TemplateMethod を使用すると、アルゴリズムの構造を変更せずに、サブクラスでアルゴリズムの特定のステップを再定義できます。
#GoF クラス図
##コード実装abstract class AbstractClass
{
public function TemplateMethod()
{
$this->PrimitiveOperation1();
$this->PrimitiveOperation2();
}
abstract public function PrimitiveOperation1();
abstract public function PrimitiveOperation2();
}
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();
クライアント呼び出しでは、サブクラスがインスタンス化されますが、サブクラスによって継承された親クラスのテンプレート メソッドが呼び出されます。統一されたアルゴリズム呼び出しを実現できます。
オブジェクト指向開発を行ったことがある人なら誰でも、ある程度テンプレート メソッド パターンを使用したことがあると思います。これは非常に一般的なためです。例
テキスト メッセージは不要です。今回は 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 '获取Memcached配置文件!', PHP_EOL; $this->config = 'memcached'; } public function OpenConnection() { echo '链接memcached!', PHP_EOL; $this->conn = 1; } public function CheckConnection() { if ($this->conn) { echo 'Memcached连接成功!', PHP_EOL; } else { echo 'Memcached连接失败,请检查配置项!', PHP_EOL; } } } class RedisCache extends Cache { public function GetConfig() { echo '获取Redis配置文件!', PHP_EOL; $this->config = 'redis'; } public function OpenConnection() { echo '链接redis!', PHP_EOL; $this->conn = 0; } public function CheckConnection() { if ($this->conn) { echo 'Redis连接成功!', PHP_EOL; } else { echo 'Redis连接失败,请检查配置项!', PHP_EOL; } } } $m = new MemcachedCache(); $r = new RedisCache();
Description
- このような単純なキャッシュ クラスを実装しました。それは多くのフレームワークのコードと非常に似ていますか?
- サブクラスは独自の実装を定義するだけでよく、繰り返されるコードの残りは親クラスに任せられます。親クラスがない場合は、すべてのサブクラスが自分で init() メソッドを実装する必要があります。
もちろん、他の実装クラスを追加する必要がある場合は、この Cache 親クラスを継承して独自の実装を完了するだけで済みます。クライアントは、最初に初期化を呼び出すだけでよいことがわかっているため、これらの実装クラスに非常に簡単に対処できます。どの実装クラスであっても、メソッドはこのクラスを使用できます。これは同じです。 元のアドレス: https://juejin.cn/post/6844903989348139021著者:ハードコアプロジェクトマネージャー推奨学習:「PHPビデオチュートリアル」
以上がPHP のテンプレート メソッド パターンの詳細な分析の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。