PHPコマンドCommandモード使用例分析
5614 ワード
この例では、PHPコマンドCommandモードの使い方について説明します.皆さんの参考にしてください.具体的には以下の通りです.
コマンドCommandモードは、GOF 23モードのうちの1つであり、動作モードである.このパターンは理解しにくい.「デザインモデル」という本には、その言葉がはっきりしていない.ネット上のいくつかの文章の解釈も間違っている.実際、コマンドモードはそれほど神秘的ではありません.
コマンドモードの理解には、2つのポイントがあります.
1.インタフェースを使用します.通常、コマンドモードのインタフェースには1つの方法しかありません.クラスを実装する方法には、インタフェースのメソッドを上書きする機能があります.オブジェクト向けプログラミングでは、
まず、インタフェースを提供します.
次に、このインタフェースの実装クラスを提供します.各実装クラスの方法は、
どのような状況が発生したのか、どのコードを実行すべきかを判断する必要はありません.すべての問題は呼び出し元によって処理されます.
コマンドモードを使用しなければ,状況が次第に増加し,例えば,従来の2種類から20種類に増加すると,方法中の判断は1回から19回に増加する.コマンドモードを使用するには,呼び出し元が2つの実装クラスから20の実装クラスに追加する必要があるだけでよい.上のtestメソッドは何も変更する必要はありません.
2.主な用途は、パラメータコールバックモードを使用することです.
最も主要なコマンドモードの使用方法は、パラメータコールバックモードを使用することです.コマンドインタフェースはメソッドのパラメータとして渡されます.次に、メソッド内でインタフェースをコールバックします.
もちろん、コマンドモードは他の方法で使用することもできます.必ずしもパラメータコールバックモードではない.
これらを理解したら、以下のプログラム例を見てみましょう.
プログラムの実行結果:
子犬実行攻撃コマンド(action)子犬実行防御コマンド(action 1)子犬実行攻撃コマンド(action)子犬実行攻撃コマンド(action)刺蛇実行攻撃コマンド(action)刺蛇実行防御コマンド(action 1)雷獣実行攻撃コマンド(action)雷獣実行防御コマンド(action 1)
コマンドモードの核心思想は,あるメソッドの具体的なクラスの例をインタフェースとして使用者に伝えることである.オブジェクトの特定のタイプの情報が消えます.使用者コードでこのインタフェースを取得してこのインタフェースを呼び出す方法.
具体的な実行効果は、コマンド発起人が提供するオブジェクトがどの実装クラスであるかによって異なります.これは、コマンド発起人に完全な制御能力を与え、使用者コードは具体的なコマンドクラスと方法に関心を持たない.同時に条件判断文を余計にする.
簡単ですか.コマンドモードは実はこんなに簡単です.
実は、GOFの23のデザインモードの中で、いくつかのモードは同じテクニックを使って実現しています.GOFのパターン分割は、テクニックではなく目的によって行われます.したがって,Commandモードや戦略モードなど実際に用いられる技法は同じである.前回同僚と技術について話しました.彼の背景はWindows C++とWindowsドライバ開発です.彼はどんなデザインモデルか分からないと言った.彼が一番役に立つのはコールバック関数だと思っている.Commandモードもコールバック関数を使用します.JAvaには関数ポインタがなく、javaにはすべてクラスとクラスのインスタンスがあります.したがって、関数ポインタを表すインスタンスを持つ関数が1つしかないインタフェースを使用する必要があります.実は同じことです.
設計モードは比較的低レベルの設計思想である.より高いレベルでは、よりマクロ的な設計技術もあります.ボブおじさんの本はいいですね.名前を忘れました.「Unixプログラミング芸術」もいいですね.もっと高いレベルのデザインを話しています.
PHPに関する詳細について興味のある読者は、「phpオブジェクト向けプログラム設計入門チュートリアル」、「PHP配列(Array)操作テクニック大全」、「PHP基本文法入門チュートリアル」、「PHP演算と演算子用法総括」、「php文字列(string)用法総括」、「php+mysqlデータベース操作入門チュートリアル」および「php一般データベース操作テクニック要約」
ここで述べたことが皆さんのPHPプログラム設計に役立つことを願っています.
コマンドCommandモードは、GOF 23モードのうちの1つであり、動作モードである.このパターンは理解しにくい.「デザインモデル」という本には、その言葉がはっきりしていない.ネット上のいくつかの文章の解釈も間違っている.実際、コマンドモードはそれほど神秘的ではありません.
コマンドモードの理解には、2つのポイントがあります.
1.インタフェースを使用します.通常、コマンドモードのインタフェースには1つの方法しかありません.クラスを実装する方法には、インタフェースのメソッドを上書きする機能があります.オブジェクト向けプログラミングでは、
if…else…
、またはswitch…case…
のような条件選択文を大量に使用することが「最悪の実践」である.通常、このようなコードは、再構築の余地があることを意味します.コマンドモードは、条件選択文を乾かす利器です.まず、インタフェースを提供します.
public interface Command {
public void execute();
}
次に、このインタフェースの実装クラスを提供します.各実装クラスの方法は、
if…else…
のコードブロック内のコードである.これにより,呼び出し側は直接特定のクラスのインスタンスを伝達すればよい.次のようになります.
Public void test(Command para){
Para.execute();
}
どのような状況が発生したのか、どのコードを実行すべきかを判断する必要はありません.すべての問題は呼び出し元によって処理されます.
コマンドモードを使用しなければ,状況が次第に増加し,例えば,従来の2種類から20種類に増加すると,方法中の判断は1回から19回に増加する.コマンドモードを使用するには,呼び出し元が2つの実装クラスから20の実装クラスに追加する必要があるだけでよい.上のtestメソッドは何も変更する必要はありません.
2.主な用途は、パラメータコールバックモードを使用することです.
最も主要なコマンドモードの使用方法は、パラメータコールバックモードを使用することです.コマンドインタフェースはメソッドのパラメータとして渡されます.次に、メソッド内でインタフェースをコールバックします.
もちろん、コマンドモードは他の方法で使用することもできます.必ずしもパラメータコールバックモードではない.
これらを理解したら、以下のプログラム例を見てみましょう.
_command[] = $command;
}
public function executeCommand()
{
foreach($this->_command as $command)
{
$command->execute();
}
}
public function removeCommand($command)
{
$key = array_search($command, $this->_command);
if($key !== false)
{
unset($this->_command[$key]);
}
}
}
//
class Receiver
{
private $_name = null;
public function __construct($name) {
$this->_name = $name;
}
public function action()
{
echo $this->_name." (action)
";
}
public function action1()
{
echo $this->_name." (action1)
";
}
}
//
class ConcreteCommand implements Command
{
private $_receiver;
public function __construct($receiver)
{
$this->_receiver = $receiver;
}
public function execute()
{
$this->_receiver->action();
}
}
// 1
class ConcreteCommand1 implements Command
{
private $_receiver;
public function __construct($receiver)
{
$this->_receiver = $receiver;
}
public function execute()
{
$this->_receiver->action1();
}
}
// 2
class ConcreteCommand2 implements Command
{
private $_receiver;
public function __construct($receiver)
{
$this->_receiver = $receiver;
}
public function execute()
{
$this->_receiver->action();
$this->_receiver->action1();
}
}
$objRecevier = new Receiver(" ");
$objRecevier1 = new Receiver(" ");
$objRecevier2 = new Receiver(" ");
$objCommand = new ConcreteCommand($objRecevier);
$objCommand1 = new ConcreteCommand1($objRecevier);
$objCommand2 = new ConcreteCommand($objRecevier1);
$objCommand3 = new ConcreteCommand1($objRecevier1);
$objCommand4 = new ConcreteCommand2($objRecevier2); // Recevier
$objInvoker = new Invoker();
$objInvoker->setCommand($objCommand);
$objInvoker->setCommand($objCommand1);
$objInvoker->executeCommand();
$objInvoker->removeCommand($objCommand1);
$objInvoker->executeCommand();
$objInvoker->setCommand($objCommand2);
$objInvoker->setCommand($objCommand3);
$objInvoker->setCommand($objCommand4);
$objInvoker->executeCommand();
?>
プログラムの実行結果:
子犬実行攻撃コマンド(action)子犬実行防御コマンド(action 1)子犬実行攻撃コマンド(action)子犬実行攻撃コマンド(action)刺蛇実行攻撃コマンド(action)刺蛇実行防御コマンド(action 1)雷獣実行攻撃コマンド(action)雷獣実行防御コマンド(action 1)
コマンドモードの核心思想は,あるメソッドの具体的なクラスの例をインタフェースとして使用者に伝えることである.オブジェクトの特定のタイプの情報が消えます.使用者コードでこのインタフェースを取得してこのインタフェースを呼び出す方法.
具体的な実行効果は、コマンド発起人が提供するオブジェクトがどの実装クラスであるかによって異なります.これは、コマンド発起人に完全な制御能力を与え、使用者コードは具体的なコマンドクラスと方法に関心を持たない.同時に条件判断文を余計にする.
簡単ですか.コマンドモードは実はこんなに簡単です.
実は、GOFの23のデザインモードの中で、いくつかのモードは同じテクニックを使って実現しています.GOFのパターン分割は、テクニックではなく目的によって行われます.したがって,Commandモードや戦略モードなど実際に用いられる技法は同じである.前回同僚と技術について話しました.彼の背景はWindows C++とWindowsドライバ開発です.彼はどんなデザインモデルか分からないと言った.彼が一番役に立つのはコールバック関数だと思っている.Commandモードもコールバック関数を使用します.JAvaには関数ポインタがなく、javaにはすべてクラスとクラスのインスタンスがあります.したがって、関数ポインタを表すインスタンスを持つ関数が1つしかないインタフェースを使用する必要があります.実は同じことです.
設計モードは比較的低レベルの設計思想である.より高いレベルでは、よりマクロ的な設計技術もあります.ボブおじさんの本はいいですね.名前を忘れました.「Unixプログラミング芸術」もいいですね.もっと高いレベルのデザインを話しています.
PHPに関する詳細について興味のある読者は、「phpオブジェクト向けプログラム設計入門チュートリアル」、「PHP配列(Array)操作テクニック大全」、「PHP基本文法入門チュートリアル」、「PHP演算と演算子用法総括」、「php文字列(string)用法総括」、「php+mysqlデータベース操作入門チュートリアル」および「php一般データベース操作テクニック要約」
ここで述べたことが皆さんのPHPプログラム設計に役立つことを願っています.