ホームページ バックエンド開発 PHPチュートリアル PHP设计模式漫谈之命令模式_PHP

PHP设计模式漫谈之命令模式_PHP

Jun 01, 2016 pm 12:20 PM
command 注文 モデル 移行

PHP设计模式漫谈我们已经连载了四期,我们知道了代理模式、责任链模式和结构模式;今天我们一起来讨论的是命令模式(Command),命令模式是封装一个通用操作的机制。

如果你熟悉C或PHP,你可能已经遇到过Command,它相当于程序中的:回调(callback)。回调通常使用一个函数指针或数据结构如PHP中的字符串和数组实现,Command是在一个方法调用之上的抽象,它吸收了所有面向对象的好处:合成、继承和处理。

例如,《设计模式》一书推荐使用Command存储用户行为链,以支持撤销和重做操作。

注意PHP 5.3函数编程能力(闭包)可以被当做Command模式的一个本地实现,但为每一个命令层次结构使用抽象数据类型有助于类型安全。

PHP设计模式中的命令模式 
PHP设计模式中的命令模式

在这个模式中,Invoker(调用者)知道传递给它的Command,无需依赖于真实的ConcreteCommand(具体的命令)实现,解决了通过配置进行方法调用相关的问题,如UI控件按钮和菜单等引用一个Command,它们的行为是通过通用的ConcreteCommand实例呈现的。

参与者:

◆Command(命令):在一个方法调用之上定义一个抽象;

◆ConcreteCommand(具体的命令):一个操作的实现;

◆Invoker(调用者):引用Command实例作为它可用的操作。

下面的代码展示了Validator组件作为Command对象实现的示例:

<ol class="dp-c">
<li class="alt"><span><span><?php  </span></span></span></li>
<li>
<span class="comment"><font color="#008200">/** </font></span> </li>
<li class="alt"><span><span class="comment"><font color="#008200"> * The Command abstraction. </font></span> </span></li>
<li><span><span class="comment"><font color="#008200"> * In this case the implementation must return a result, </font></span> </span></li>
<li class="alt"><span><span class="comment"><font color="#008200"> * sometimes it only has side effects. </font></span> </span></li>
<li><span><span class="comment"><font color="#008200"> */</font></span><span> </span></span></li>
<li class="alt">
<span class="keyword"><strong><font color="#006699">interface</font></strong></span><span> Validator  </span>
</li>
<li><span>{  </span></li>
<li class="alt">
<span>    </span><span class="comment"><font color="#008200">/** </font></span> </li>
<li><span><span class="comment"><font color="#008200">     * The method could have any parameters. </font></span> </span></li>
<li class="alt"><span><span class="comment"><font color="#008200">     * @param mixed </font></span> </span></li>
<li><span><span class="comment"><font color="#008200">     * @return boolean </font></span> </span></li>
<li class="alt"><span><span class="comment"><font color="#008200">     */</font></span><span> </span></span></li>
<li>
<span>    </span><span class="keyword"><strong><font color="#006699">public</font></strong></span><span> </span><span class="keyword"><strong><font color="#006699">function</font></strong></span><span> isValid(</span><span class="vars"><font color="#dd0000">$value</font></span><span>);  </span>
</li>
<li class="alt"><span>}  </span></li>
<li><span> </span></li>
<li class="alt">
<span class="comment"><font color="#008200">/** </font></span> </li>
<li><span><span class="comment"><font color="#008200"> * ConcreteCommand. </font></span> </span></li>
<li class="alt"><span><span class="comment"><font color="#008200"> */</font></span><span> </span></span></li>
<li>
<span class="keyword"><strong><font color="#006699">class</font></strong></span><span> MoreThanZeroValidator </span><span class="keyword"><strong><font color="#006699">implements</font></strong></span><span> Validator  </span>
</li>
<li class="alt"><span>{  </span></li>
<li>
<span>    </span><span class="keyword"><strong><font color="#006699">public</font></strong></span><span> </span><span class="keyword"><strong><font color="#006699">function</font></strong></span><span> isValid(</span><span class="vars"><font color="#dd0000">$value</font></span><span>)  </span>
</li>
<li class="alt"><span>    {  </span></li>
<li>
<span>        </span><span class="keyword"><strong><font color="#006699">return</font></strong></span><span> </span><span class="vars"><font color="#dd0000">$value</font></span><span> > 0;  </span>
</li>
<li class="alt"><span>    }  </span></li>
<li><span>}  </span></li>
<li class="alt"><span> </span></li>
<li>
<span class="comment"><font color="#008200">/** </font></span> </li>
<li class="alt"><span><span class="comment"><font color="#008200"> * ConcreteCommand. </font></span> </span></li>
<li><span><span class="comment"><font color="#008200"> */</font></span><span> </span></span></li>
<li class="alt">
<span class="keyword"><strong><font color="#006699">class</font></strong></span><span> EvenValidator </span><span class="keyword"><strong><font color="#006699">implements</font></strong></span><span> Validator  </span>
</li>
<li><span>{  </span></li>
<li class="alt">
<span>    </span><span class="keyword"><strong><font color="#006699">public</font></strong></span><span> </span><span class="keyword"><strong><font color="#006699">function</font></strong></span><span> isValid(</span><span class="vars"><font color="#dd0000">$value</font></span><span>)  </span>
</li>
<li><span>    {  </span></li>
<li class="alt">
<span>        </span><span class="keyword"><strong><font color="#006699">return</font></strong></span><span> </span><span class="vars"><font color="#dd0000">$value</font></span><span> % 2 == 0;  </span>
</li>
<li><span>    }  </span></li>
<li class="alt"><span>}  </span></li>
<li><span> </span></li>
<li class="alt">
<span class="comment"><font color="#008200">/** </font></span> </li>
<li><span><span class="comment"><font color="#008200"> * The Invoker. An implementation could store more than one </font></span> </span></li>
<li class="alt"><span><span class="comment"><font color="#008200"> * Validator if needed. </font></span> </span></li>
<li><span><span class="comment"><font color="#008200"> */</font></span><span> </span></span></li>
<li class="alt">
<span class="keyword"><strong><font color="#006699">class</font></strong></span><span> ArrayProcessor  </span>
</li>
<li><span>{  </span></li>
<li class="alt">
<span>    </span><span class="keyword"><strong><font color="#006699">protected</font></strong></span><span> </span><span class="vars"><font color="#dd0000">PHP设计模式漫谈我们已经连载了四期,我们知道了代理模式、责任链模式和<font color="#0000ff">结构模式</font>;今天我们一起来讨论的是命令模式(Command),命令模式是封装一个通用操作的机制。
<p>如果你熟悉C或PHP,你可能已经遇到过Command,它相当于程序中的:回调(callback)。回调通常使用一个函数指针或数据结构如PHP中的字符串和数组实现,Command是在一个方法调用之上的抽象,它吸收了所有面向对象的好处:合成、继承和处理。</p>
<p>例如,《设计模式》一书推荐使用Command存储用户行为链,以支持撤销和重做操作。</p>
<p>注意PHP 5.3函数编程能力(闭包)可以被当做Command模式的一个本地实现,但为每一个命令层次结构使用抽象数据类型有助于类型安全。</p>
<p style="TEXT-ALIGN: center"><img class="fit-image lazy" src="/static/imghw/default1.png" data-src="http://img.bitscn.com/upimg/allimg/100413/115P52291-0.jpg" onmousewheel="javascript:return big(this)"   style="max-width:90%"  style="max-width:90%" alt="PHP设计模式中的命令模式"  style="max-width:90%" onload="javascript:if(this.width>498)this.style.width=498;" border="0"> <br><strong><span style="FONT-SIZE: smaller"><font size="2">PHP设计模式中的命令模式</font></span></strong></p>
<p>在这个模式中,Invoker(调用者)知道传递给它的Command,无需依赖于真实的ConcreteCommand(具体的命令)实现,解决了通过配置进行方法调用相关的问题,如UI控件按钮和菜单等引用一个Command,它们的行为是通过通用的ConcreteCommand实例呈现的。</p>
<p><strong>参与者:</strong></p>
<p>◆Command(命令):在一个方法调用之上定义一个抽象;</p>
<p>◆ConcreteCommand(具体的命令):一个操作的实现;</p>
<p>◆Invoker(调用者):引用Command实例作为它可用的操作。</p>
<p>下面的代码展示了Validator组件作为Command对象实现的示例:</p>
<pre class="brush:php;toolbar:false">___FCKpd___0
ログイン後にコピー

使用PHP设计模式中的命令模式的一些注意事项:

◆方法调用中的某些参数可以在构造ConcreteCommand时提供,有效地局部套用(currying)原始函数;

◆一个Command可以被看作是一个非常简单的只有一个方法的策略(Strategy),重点放在对象的操作上;

◆ConcreteCommands也要组织它们需要的每一个资源,以实现它们的目标,主要是行为的Receiver(接受者),它们调用方法执行一个Command;

◆复合模式,装饰模式和其它模式都可以和命令模式组合,获得更多的Command,装饰Command等等。

rule;  
  •  
  •     public function __construct (Validator $rule)  
  •     {  
  •         $this->_rule = $rule;  
  •     }  
  •  
  •     public function process(array $numbers)  
  •     {  
  •         foreach ($numbers as $n) {  
  •             if ($this->_rule->IsValid($n)) {  
  •                 echo $n"\n";  
  •             }  
  •         }  
  •     }  
  • }  
  •  
  • // Client code  
  • $processor = new ArrayProcessor(new EvenValidator());  
  • $processor->process(array(1, 20, 18, 5, 0, 31, 42)); 
  • 使用PHP设计模式中的命令模式的一些注意事项:

    ◆方法调用中的某些参数可以在构造ConcreteCommand时提供,有效地局部套用(currying)原始函数;

    ◆一个Command可以被看作是一个非常简单的只有一个方法的策略(Strategy),重点放在对象的操作上;

    ◆ConcreteCommands也要组织它们需要的每一个资源,以实现它们的目标,主要是行为的Receiver(接受者),它们调用方法执行一个Command;

    ◆复合模式,装饰模式和其它模式都可以和命令模式组合,获得更多的Command,装饰Command等等。

    このウェブサイトの声明
    この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、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衣類リムーバー

    Video Face Swap

    Video Face Swap

    完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

    ホットツール

    メモ帳++7.3.1

    メモ帳++7.3.1

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

    SublimeText3 中国語版

    SublimeText3 中国語版

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

    ゼンドスタジオ 13.0.1

    ゼンドスタジオ 13.0.1

    強力な PHP 統合開発環境

    ドリームウィーバー CS6

    ドリームウィーバー CS6

    ビジュアル Web 開発ツール

    SublimeText3 Mac版

    SublimeText3 Mac版

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

    WeChat の「おやすみモード」は何をするのですか? WeChat の「おやすみモード」は何をするのですか? Feb 23, 2024 pm 10:48 PM

    WeChat のサイレント モードとはどういう意味ですか? 現在、スマートフォンの人気とモバイル インターネットの急速な発展により、ソーシャル メディア プラットフォームは人々の日常生活に欠かせないものとなっています。 WeChat は中国で最も人気のあるソーシャル メディア プラットフォームの 1 つであり、ほとんどの人が WeChat アカウントを持っています。私たちは WeChat を通じて友人、家族、同僚とリアルタイムでコミュニケーションを取り、生活の瞬間を共有し、お互いの現在の状況を理解することができます。しかし、この時代では、特に集中力や集中力が必要な人々にとって、情報過多やプライバシー漏洩の問題にも必然的に直面します。

    Windows 11/10でSUDOコマンドを実行する方法 Windows 11/10でSUDOコマンドを実行する方法 Mar 09, 2024 am 09:50 AM

    sudo コマンドを使用すると、ユーザーはスーパーユーザー モードに切り替えることなく、昇格された特権モードでコマンドを実行できます。この記事では、Windows システムで sudo コマンドに似た機能をシミュレートする方法を紹介します。修道コマンドとは何ですか? Sudo (「スーパーユーザー do」の略) は、Linux や MacOS などの Unix ベースのオペレーティング システムのユーザーが、通常は管理者が持つ昇格した権限でコマンドを実行できるようにするコマンド ライン ツールです。 Windows 11/10 での SUDO コマンドの実行 ただし、最新の Windows 11 Insider Preview バージョンのリリースにより、Windows ユーザーはこの機能を体験できるようになりました。この新機能により、ユーザーは次のことが可能になります。

    Win11 でネットワーク カードの MAC アドレスを確認する方法 Win11 でネットワーク カードの MAC アドレスを取得するコマンドを使用する方法 Win11 でネットワーク カードの MAC アドレスを確認する方法 Win11 でネットワーク カードの MAC アドレスを取得するコマンドを使用する方法 Feb 29, 2024 pm 04:34 PM

    この記事では、Win11 システムでコマンド プロンプト (CommandPrompt) を使用してネットワーク アダプターの物理アドレス (MAC アドレス) を確認する方法を読者に紹介します。 MAC アドレスは、ネットワーク通信において重要な役割を果たすネットワーク インターフェイス カード (NIC) の一意の識別子です。コマンド プロンプトを介して、ユーザーは現在のコンピュータ上のすべてのネットワーク アダプタの MAC アドレス情報を簡単に取得できます。これは、ネットワークのトラブルシューティング、ネットワーク設定の構成、その他のタスクに非常に役立ちます。方法 1: 「コマンド プロンプト」を使用する 1. [Win+X] キーの組み合わせを押すか、タスク バーの [Windows ロゴ] を [右クリック] して、表示されるメニュー項目で [ファイル名を指定して実行] を選択します。ウィンドウを実行し、[cmd]コマンドを入力して、

    hyperv 拡張セッション モードはどこにありますか? Win11 でコマンドを使用して Hyper-V 拡張セッション モードを有効または無効にするためのヒント hyperv 拡張セッション モードはどこにありますか? Win11 でコマンドを使用して Hyper-V 拡張セッション モードを有効または無効にするためのヒント Feb 29, 2024 pm 05:52 PM

    Win11 システムでは、コマンドを使用して Hyper-V 拡張セッション モードを有効または無効にできます。この記事では、コマンドを使用して操作する方法を紹介し、ユーザーがシステム内の Hyper-V 機能をより適切に管理および制御できるようにします。 Hyper-V は Microsoft が提供する仮想化テクノロジであり、Windows Server、Windows 10 および 11 (Home Edition を除く) に組み込まれており、ユーザーは Windows システムで仮想オペレーティング システムを実行できます。仮想マシンはホスト オペレーティング システムから分離されていますが、設定を通じてサウンド カードやストレージ デバイスなどのホストのリソースを引き続き使用できます。重要な設定の 1 つは、拡張セッション モードを有効にすることです。拡張セッションモードはハイパーです

    超実用的! Linux マスターになれる Sar コマンド 超実用的! Linux マスターになれる Sar コマンド Mar 01, 2024 am 08:01 AM

    1. 概要 sar コマンドは、システムアクティビティから収集されたデータを通じてシステム使用状況レポートを表示します。これらのレポートはさまざまなセクションで構成されており、各セクションにはデータの種類とデータが収集された時期が含まれます。 sar コマンドのデフォルト モードでは、CPU にアクセスするさまざまなリソース (ユーザー、システム、I/O スケジューラなど) の CPU 使用率がさまざまな時間増分で表示されます。さらに、特定の期間におけるアイドル状態の CPU の割合も表示されます。各データ ポイントの平均値はレポートの下部にリストされます。 sar レポートはデフォルトで 10 分ごとにデータを収集しますが、さまざまなオプションを使用してこれらのレポートをフィルタリングおよび調整できます。 uptime コマンドと同様に、sar コマンドも CPU 負荷の監視に役立ちます。 sarにより過負荷の発生が把握できる

    iPhoneでサイレントモードが機能しない:修正 iPhoneでサイレントモードが機能しない:修正 Apr 24, 2024 pm 04:50 PM

    おやすみモードで電話に応答することさえ、非常に煩わしい経験になる可能性があります。名前が示すように、おやすみモードでは、すべての着信通知と電子メール、メッセージなどからの警告がオフになります。これらのソリューション セットに従って問題を修正できます。解決策 1 – フォーカス モードを有効にする 携帯電話でフォーカス モードを有効にします。ステップ 1 – 上から下にスワイプしてコントロール センターにアクセスします。ステップ 2 – 次に、携​​帯電話の「フォーカスモード」を有効にします。フォーカス モードでは、電話機のサイレント モードが有効になります。携帯電話に着信通知が表示されることはありません。解決策 2 – フォーカス モード設定を変更する フォーカス モード設定に問題がある場合は、修正する必要があります。ステップ 1 – iPhone の設定ウィンドウを開きます。ステップ 2 – 次に、フォーカス モード設定をオンにします

    Linux のアーティファクト:eventfd の原理と応用 Linux のアーティファクト:eventfd の原理と応用 Feb 13, 2024 pm 08:30 PM

    Linux は、パイプ、シグナル、メッセージ キュー、共有メモリなど、多くの効率的なプロセス間通信メカニズムを提供する強力なオペレーティング システムです。しかし、よりシンプルで、より柔軟で、より効率的なコミュニケーション方法はあるのでしょうか?答えは「はい」です、それはeventfdです。 eventfd は Linux バージョン 2.6 で導入されたシステム コールで、イベント通知の実装、つまりファイル記述子を通じてイベントを配信するために使用できます。 eventsfd にはカーネルが保持する 64 ビット符号なし整数カウンタが含まれており、プロセスはこのファイル記述子を読み書きすることでカウンタ値を読み書きし、プロセス間通信を実現します。イベントFDの利点は何ですか?以下のような特徴があります

    win11 ウィジェットを削除する方法 Windows 11 ウィジェットをアンインストールする 1 つのコマンド機能のヒント win11 ウィジェットを削除する方法 Windows 11 ウィジェットをアンインストールする 1 つのコマンド機能のヒント Apr 11, 2024 pm 05:19 PM

    ウィジェットは Win11 システムの新機能で、デフォルトでオンになっていますが、ウィジェットをあまり使用しないユーザーや、スペースを占有するためウィジェットを無効にしたいというユーザーがいることは避けられません。以下のエディターで操作方法が説明されているので、実際に試してみることができます。ウィジェットとは何ですか?ウィジェットは、Windows デスクトップ上のお気に入りのアプリやサービスの動的コンテンツを表示する小さなカードです。これらはウィジェット ボードに表示され、興味を反映するようにウィジェットの検索、固定、固定解除、配置、サイズ変更、カスタマイズを行うことができます。ウィジェット ボードは、使用状況に基づいて関連するウィジェットとパーソナライズされたコンテンツを表示するように最適化されています。タスクバーの左隅からウィジェットパネルを開くと、ライブ天気が表示されます

    See all articles