ホームページ バックエンド開発 PHPチュートリアル デザインパターン入門 - テンプレートメソッドパターン(php版)

デザインパターン入門 - テンプレートメソッドパターン(php版)

Aug 08, 2016 am 09:27 AM
function public quot

ジョークには次のようなものがあります: 象を冷蔵庫に入れるのに何歩かかりますか?

1. 冷蔵庫を開けます

2. 象を中に詰めます

同様に、ライオンを冷蔵庫に入れるには何ステップかかりますか?

1. 冷蔵庫を開けます

2. ライオンを中に詰めます

3. 冷蔵庫を閉めます

上記の例では、2 つの方法は実際には同じステップを持っていますが、具体的な実装が少し異なることがわかりましたか?つまり、これら 2 種類の動作はステップ テンプレートを共有できます。これは、今回説明するデザイン パターン、つまりテンプレート デザイン パターンにつながります。

テンプレート設計パターンの原理は、以下に示すような UML クラス図で表すことができます:

具体的なコード例:

LockAnimal.php

<?php
/**
 * 将动物锁进冰箱里抽象类
 * @author ben
 *
 */
abstract class LockAnimal{
    /**
     * 模板方法,使用final关键词防止子类覆盖
     */
   public final function lock(){
       $this->open();
       $this->push();
       $this->close();
   } 
   
   /**
    * 打开冰箱
    */
   abstract function open();
   
   /**
    * 将动物推进冰箱
    */
   abstract function push();
   
   /**
    * 关上冰箱
    */
   abstract function close();
}
ログイン後にコピー
LockElephant.php
<?php
/**
 * 将狮子锁进冰箱里
 * @author ben
 *
 */
require_once &#39;LockAnimal.php&#39;;
class LockElephant extends LockAnimal{
   
   /**
    * (non-PHPdoc)
    * @see LockAnimal::open()
    */
   public function open(){
       echo "in order to lock an elephant into a fridge, you need to open the fridge first<br />";
   }
   
   /**
    * (non-PHPdoc)
    * @see LockAnimal::push()
    */
   public function push(){
       echo "i'm pushing the elephant<br />";
   }
   
   /**
    * (non-PHPdoc)
    * @see LockAnimal::close()
    */
   public function close(){
       echo "finally, now i can close the fridge<br />";
   }
}
ログイン後にコピー
ログイン後にコピー
LockLion.php
<?php
/**
 * 将狮子锁进冰箱里
 * @author ben
 *
 */
require_once 'LockAnimal.php';
class LockLion extends LockAnimal{
   
   /**
    * (non-PHPdoc)
    * @see LockAnimal::open()
    */
   public function open(){
       echo "in order to lock an lion into a fridge, you need to open the fridge first<br />";
   }
   
   /**
    * (non-PHPdoc)
    * @see LockAnimal::push()
    */
   public function push(){
       echo "i'm pushing the lion<br />";
   }
   
   /**
    * (non-PHPdoc)
    * @see LockAnimal::close()
    */
   public function close(){
       echo "finally, now i can close the fridge<br />";
   }
}
ログイン後にコピー

さて問題は、どの会社が最高の掘削機技術を持っているのかということです。冗談です。一部の動物はより凶暴で、素直に冷蔵庫に押し込められません。この状況に対処するには、プログラムにフックを追加する必要があります。変更されたコードは次のとおりです:

LockAnimal.php

<?php
/**
 * 将动物锁进冰箱里抽象类
 * @author ben
 *
 */
abstract class LockAnimal{
    /**
     * 模板方法,使用final关键词防止子类覆盖
     */
   public final function lock(){
       $this->open();
       if($this->needAnesthetic()){
           $this->anesthetic();
       }
       $this->push();
       $this->close();
   } 
   
   /**
    * 打开冰箱
    */
   abstract function open();
   
   /**
    * 是否需要麻醉
    */
   protected function needAnesthetic(){
       return false;
   }
   
   protected function anesthetic(){
       echo "anestheticing the animal";
   }
   
   /**
    * 将动物推进冰箱
    */
   abstract function push();
   
   /**
    * 关上冰箱
    */
   abstract function close();
}
ログイン後にコピー

LockElephant.php
<?php
/**
 * 将狮子锁进冰箱里
 * @author ben
 *
 */
require_once &#39;LockAnimal.php&#39;;
class LockElephant extends LockAnimal{
   
   /**
    * (non-PHPdoc)
    * @see LockAnimal::open()
    */
   public function open(){
       echo "in order to lock an elephant into a fridge, you need to open the fridge first<br />";
   }
   
   /**
    * (non-PHPdoc)
    * @see LockAnimal::push()
    */
   public function push(){
       echo "i'm pushing the elephant<br />";
   }
   
   /**
    * (non-PHPdoc)
    * @see LockAnimal::close()
    */
   public function close(){
       echo "finally, now i can close the fridge<br />";
   }
}
ログイン後にコピー
ログイン後にコピー
LockLion.php
<?php
/**
 * 将狮子锁进冰箱里
 * @author ben
 *
 */
require_once 'LockAnimal.php';
class LockLion extends LockAnimal{
   
   /**
    * (non-PHPdoc)
    * @see LockAnimal::open()
    */
   public function open(){
       echo "in order to lock an lion into a fridge, you need to open the fridge first<br />";
   }
   
   protected function needAnesthetic(){
       return true;
   }
   
   protected function anesthetic(){
       echo "anestheticing the lion<br />";
   }
   
   /**
    * (non-PHPdoc)
    * @see LockAnimal::push()
    */
   public function push(){
       echo "i'm pushing the lion<br />";
   }
   
   /**
    * (non-PHPdoc)
    * @see LockAnimal::close()
    */
   public function close(){
       echo "finally, now i can close the fridge<br />";
   }
}
ログイン後にコピー
index.php
<?php
require_once &#39;LockElephant.php&#39;;
require_once &#39;LockLion.php&#39;;

$elephant = new LockElephant();
$lion = new LockLion();

$elephant->lock();
$lion->lock();
ログイン後にコピー

テンプレート メソッド設計パターンの正式な定義は、次のとおりです。一部のステップをサブクラスに延期しながら、メソッド内でアルゴリズムのスケルトンを定義します。テンプレート メソッドを使用すると、アルゴリズムの構造を変更せずに、サブクラスがアルゴリズムの特定のステップを再定義できます。

以上、デザインパターン入門 - テンプレートメソッドパターン(php編)を関連内容も含めて紹介しましたので、PHPチュートリアルに興味のある方の参考になれば幸いです。

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

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

AI Hentai Generator

AI Hentai Generator

AIヘンタイを無料で生成します。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

機能とはどういう意味ですか? 機能とはどういう意味ですか? Aug 04, 2023 am 10:33 AM

ファンクションとは、関数を意味します。これは、特定の関数を備えた再利用可能なコード ブロックです。プログラムの基本コンポーネントの 1 つです。入力パラメータを受け取り、特定の操作を実行し、結果を返すことができます。その目的は、再利用可能なコード ブロックをカプセル化することです。コードの再利用性と保守性を向上させるコード。

iOS の開発者バージョンとパブリック バージョンの違いは何ですか? iOS の開発者バージョンとパブリック バージョンの違いは何ですか? Mar 01, 2024 pm 12:55 PM

毎年、Apple が iOS と macOS の新しいメジャー バージョンをリリースする前に、ユーザーは数か月前にベータ版をダウンロードして最初に体験することができます。同ソフトウェアは一般ユーザーと開発者の両方が使用するため、Appleは開発者向けベータ版のパブリックベータ版である開発者版とパブリック版を両方向けに開始した。 iOS の開発者バージョンとパブリック バージョンの違いは何ですか?文字通りに言うと、開発者バージョンは開発者テスト バージョンであり、パブリック バージョンは公開テスト バージョンです。開発者バージョンとパブリック バージョンは、異なるユーザーを対象としています。開発者バージョンは、Apple が開発者によるテストのために使用します。ダウンロードしてアップグレードするには、Apple 開発者アカウントが必要です。

Python の「enumerate()」関数の目的は何ですか? Python の「enumerate()」関数の目的は何ですか? Sep 01, 2023 am 11:29 AM

この記事では、Python の enumerate() 関数と「enumerate()」関数の目的について学びます。 enumerate() 関数とは何ですか? Python の enumerate() 関数は、データ コレクションをパラメータとして受け取り、列挙オブジェクトを返します。列挙オブジェクトはキーと値のペアとして返されます。キーは各項目に対応するインデックス、値は項目です。構文 enumerate(iterable,start) パラメータ iterable - 渡されたデータ コレクションは、iterablestart と呼ばれる列挙オブジェクトとして返すことができます。 - 名前が示すように、列挙オブジェクトの開始インデックスは start によって定義されます。無視したら

php提交表单通过后,弹出的对话框怎样在当前页弹出,该如何解决 php提交表单通过后,弹出的对话框怎样在当前页弹出,该如何解决 Jun 13, 2016 am 10:23 AM

php提交表单通过后,弹出的对话框怎样在当前页弹出php提交表单通过后,弹出的对话框怎样在当前页弹出而不是在空白页弹出?想实现这样的效果:而不是空白页弹出:------解决方案--------------------如果你的验证用PHP在后端,那么就用Ajax;仅供参考:HTML code

MySQL.procテーブルの役割と機能の詳しい説明 MySQL.procテーブルの役割と機能の詳しい説明 Mar 16, 2024 am 09:03 AM

MySQL.proc テーブルの役割と機能の詳細な説明。MySQL は人気のあるリレーショナル データベース管理システムです。開発者が MySQL を使用する場合、多くの場合、ストアド プロシージャ (StoredProcedure) の作成と管理が必要になります。 MySQL.proc テーブルは非常に重要なシステム テーブルであり、ストアド プロシージャの名前、定義、パラメータなど、データベース内のすべてのストアド プロシージャに関連する情報が保存されます。この記事では、MySQL.proc テーブルの役割と機能について詳しく説明します。

Vue.use関数の使い方と機能 Vue.use関数の使い方と機能 Jul 24, 2023 pm 06:09 PM

Vue の使い方と機能.use Function Vue は、多くの便利な機能を提供する人気のフロントエンド フレームワークです。その 1 つは Vue.use 関数で、これを使用すると Vue アプリケーションでプラグインを使用できるようになります。この記事では、Vue.use 関数の使い方と機能を紹介し、いくつかのコード例を示します。 Vue.use 関数の基本的な使用法は非常に簡単です。Vue がインスタンス化される前に関数を呼び出し、使用するプラグインをパラメータとして渡すだけです。簡単な例を次に示します。 // プラグインの導入と使用

PHP の file_exists() 関数 PHP の file_exists() 関数 Sep 14, 2023 am 08:29 AM

file_exists メソッドは、ファイルまたはディレクトリが存在するかどうかを確認します。チェックするファイルまたはディレクトリのパスを引数として受け取ります。これは、ファイルを処理する前に存在するかどうかを知る必要がある場合に役立ちます。これにより、新しいファイルを作成するときに、この関数を使用してファイルがすでに存在するかどうかを確認できます。構文 file_exists($file_path) パラメータ file_path - 存在をチェックするファイルまたはディレクトリのパスを設定します。必須。 return file_exists() メソッドが戻ります。ファイルまたはディレクトリが存在する場合は TrueFalse を返し、ファイルまたはディレクトリが存在しない場合は TrueFalse を返します。 例として、「candidate.txt」ファイルのチェックを見てみましょう。

js関数の使い方は何ですか js関数の使い方は何ですか Oct 07, 2023 am 11:25 AM

js関数関数の使い方は、1. 関数の宣言、2. 関数の呼び出し、3. 関数のパラメータ、4. 関数の戻り値、5. 無名関数、6. パラメータとしての関数、7. 関数のスコープ、8. 再帰関数です。

See all articles