ホームページ >バックエンド開発 >PHPチュートリアル >コマンド設計パターンを理解する

コマンド設計パターンを理解する

Christopher Nolan
Christopher Nolanオリジナル
2025-03-01 09:02:10334ブラウズ

Understanding the Command Design Pattern

コアポイント

  • コマンドモード(アクションモードまたはトランザクションモードとも呼ばれます)は、リクエストをオブジェクトにカプセル化し、異なるリクエストを持つクライアントがキューまたはレコードを可能にします。これは、キュー自体からの実際の実行の実装を分離しながら、順次処理のためにリクエストをキューに掲載できるコマンドキューを実装するのに非常に役立ちます。
  • さまざまなチャネル(電子メールとテキストメッセージ)を介してメッセージを異なるユーザーグループに送信する必要があるシナリオでは、コマンドモードは統一されたアプローチを提供します。これにより、すべての顧客を、顧客のコミュニケーションの好みに関係なく、適切なiMessageの実装をインスタンス化して、各グループのこのプロセスを繰り返すのではなく、一度に処理できるようになります。
  • コマンドモードは、実行するアクションによってオブジェクトをパラメーター化する状況に最適です。

今日、世界中で40億以上の携帯電話が使用されています。オーストラリアだけでも、人口は約1,100万人ですが、携帯電話の数は2,200万を超えています。携帯電話の使用がますます一般的になっていることは明らかです。スマートフォンやその他のモバイルデバイスの人気を考えると、ますます多くの顧客が電子メールではなくテキストメッセージを介して通知を受信することを選択しています。 SMSには電子メールよりも利点があります。それらは短く、瞬時であり、最も重要なことに、スパムは無視できます。それで、これはコマンドモードと何の関係があるのでしょうか?架空のシーンを見てみましょう。会社には、賞を受賞した競争を毎日開催するウェブサイトがあります。 250,000人以上の登録ユーザーのデータベースがあり、各ユーザーは毎日パスワードを受け取ります。これを入力するか、リンクをクリックして宝くじに登録する必要があります。ほとんどのユーザーは電子メールを受信することを選択しますが、今ではかなりの数のユーザーがテキストメッセージを介して通知を受信することを選択しました。質問は次のとおりです。2つの異なるチャネルを介して2つのグループのユーザーにメッセージを送信する方法は?論理的なアプローチは、ユーザーを2つのグループ、電子メール受信者とSMS受信者に分割することです。これには、2つの異なるクエリを実行し、各グループにパスワードを個別に送信することが含まれます。この記事で説明するコマンドパターンを使用して、単一のプロセスを介して2つのグループのユーザーにメッセージを送信できます。

コマンドモードを使用した

メッセージキュー

コマンドモード(アクションモードまたはトランザクションモードと呼ばれることもあります)は、リクエストがオブジェクトとしてカプセル化されている方法を説明するデザインパターンであり、異なるリクエストでクライアントをキューまたはレコードできるようにします。コマンドモードの仕組みを示すために、メッセージキューの簡単な例を使用しましょう。以下は、メッセージqueueクラスの定義です。

<?php
class MessageQueue
{
    private $queue;

    public function __construct() {
        $this->queue = array();
    }

    public function addMessage(IMessage $msg) {
        $this->queue[] = $msg;
    }

    public function execute() {
        $sendCount = 0;
        foreach ($this->queue as $msg) {
            if ($msg->send()) {
                $sendCount++;
            }
        }
        return $sendCount;
    }
}

メッセージキューは、addmessage()メソッドと、キューにメッセージオブジェクトを追加します。この例では、addMessage()メソッドはメッセージを内部配列$ queueに追加するだけで、execute()メソッドは$ queueの要素を反復し、各メッセージオブジェクトのsend()メソッドを呼び出します。コマンドモードは、後の処理の各リクエストをキューします。これはリクエストオブジェクトの責任になるため、メッセージqueueはリクエストの処理方法を知る必要はありません。 send()メソッドが利用可能であることを確認するには、メッセージオブジェクトがimessageインターフェイスを実装する必要があります。

<?php
interface IMessage
{
    public function send();
}

各メッセージオブジェクトは、iMessageインターフェイスを実装し、send()メソッドの独自の実装を提供します。

<?php
class DailyAlertEmail implements IMessage
{
    // ...
    public function send() {
        // 发送电子邮件的实际代码
        // ...
        echo "Sending message via email\n";
    }
}

class DailyAlertSMS implements IMessage
{
    // ...
    public function send() {
        // 发送短信的实际代码
        // ...
        echo "Sending message via SMS\n";
    }
}

DayerAlerteMailメッセージは、そのsend()メソッドを電子メールとして送信するためにそのsend()メソッドを実装し、dayraLertsmsメッセージオブジェクトはそのsend()メソッドをSMSメッセージとしてメッセージを送信するために実装します。次に、SMSと電子メール受信者にメッセージを送信するには、データベースを照会して通信設定を取得し、適切なiMessageオブジェクトをインスタンス化し、メッセージキューに追加してから、Queueのexecute()メソッドを呼び出します。ちなみに、ユーザー向けに正しいiMessageオブジェクトを作成することは、ファクトリーメソッドのデザインパターンを使用する良い機会になります!

<?php
// 创建一个新的队列
$msgQueue = new MessageQueue();

$result = $db->query("SELECT * FROM customers");
while ($customer = $result->fetch(PDO::FETCH_ASSOC)) {
    // 工厂根据用户的偏好创建DailyAlertSMS或DailyAlertEmail对象
    $msg = MessageFactory::build($customer, $codeword);

    // 将消息对象添加到队列中
    $msgQueue->addMessage($msg);
}

// 现在发送给所有客户
$msgQueue->execute();

コマンドモードを使用して、顧客の通信設定に関係なく、すべての顧客をデータベースから取得し、適切なiMessageの実装をインスタンス化して、すべてのSMS顧客のデータベースを最初に照会して処理する代わりに、それらを一度に処理できます。これは単なる基本的な例であることを忘れないでください。いくつかのマイナーな変更を使用すると、それをCRONタスクとして実行する「遅延した」メッセージキューに変換し、データベースを使用してプロセスの進捗を監視できます。

概要

ご覧のとおり、コマンドモードは次の状況に最適です。

    実行するアクションによってオブジェクトをパラメーター化できるようにしたい。
  • さまざまな時間にリクエストを指定、キュー、および実行する必要があります。
  • 一連のデータを単一の操作(トランザクションなど)にカプセル化する必要がある場合。
  • このチュートリアルでは、コマンドパターンがコマンドキューを実装するための有用なデザインパターンになる方法を示します。ここでは、キュー自体からの実行の実際の実装を分離しながら、順次処理のためにリクエストをキューに掲載できます。
horiyan / shutterstock

コマンドデザインパターンFAQ(FAQ)

コマンドデザインパターンの主な目的は何ですか?

コマンド設計パターンは、主にリクエストの送信者と受信者を切り離すために使用されます。これは、送信者が実行されているアクションの詳細やリクエストの受信者を知る必要がないことを意味します。代わりに、送信者はコマンドの発行方法を知っており、コマンドはリクエストの実行方法を知っています。このモードは、操作パラメーター化されたオブジェクトを使用するシナリオで特に役立ち、さまざまな時間にリクエストをキュー、指定、実行する必要があります。

コマンドデザインパターンはどのように機能しますか?

コマンド設計パターンは、リクエストをオブジェクトにカプセル化し、ユーザーがキュー、リクエスト、および操作を使用してクライアントをパラメーター化できるようにすることで機能します。コマンド、レシーバー、発信者、およびクライアントの4つのコンポーネントが含まれます。コマンドは操作を実行するためにインターフェイスを宣言し、受信者は操作の実行方法を知っており、発信者はコマンドを保存し、ある時点でコマンドに実行メソッドを呼び出してリクエストを実行するように依頼し、クライアントはコンクリートコマンドオブジェクトを作成し、レシーバーを設定します。

コマンドデザインパターンを使用することの利点は何ですか?

コマンド設計パターンは多くの利点を提供します。操作を呼び出すクラスと操作の実行方法を知っているオブジェクトを切り離します。これにより、キューシステムを提供することで一連のコマンドを作成でき、これらのコマンドの実行を制御できます。さらに、各コマンドは特定のメソッドを持つオブジェクトであるため、元の操作をサポートします。

コマンドデザインパターンはいつ使用する必要がありますか?

コマンド設計パターンは、要求されているアクションやリクエストの受信者を知らずにオブジェクトにリクエストを行う必要がある場合に特に役立ちます。また、操作パラメーター化されたオブジェクトを使用する必要があり、異なる時間にリクエストをキュー、指定、実行する必要がある場合にも有益です。

使用されているコマンドデザインパターンの例を提供できますか?

もちろん、コマンド設計パターンの一般的な例は、グラフィカルユーザーインターフェイス(GUI)にメニューシステムを実装することです。メニュー内の各アクションはコマンドになる可能性があります。ユーザーがメニュー項目をクリックすると、アイテムに関連付けられたコマンドが実行されます。

コマンドとポリシーの設計パターンの違いは何ですか?

両方のモードはアルゴリズムを別のコンポーネントにカプセル化しますが、その目的は異なります。コマンドモードとは、コマンドを実行する責任からコマンドを発行する責任を分離し、コマンドを追加したり、コマンドの実行を変更したりできるようにすることです。一方、ポリシーパターンは、一連のアルゴリズムを定義し、各アルゴリズムをカプセル化し、それらを交換可能にすることです。

コマンド設計パターンを元に戻すために使用できますか?

はい、コマンドデザインパターンは、元の操作をサポートできます。これを行うには、コマンドクラスは、その効果を逆転させ、オブジェクトを以前の状態に復元する元に戻す方法を実装する状態を維持する必要があります。

コマンドデザインパターンは、マルチスレッドプログラミングに適していますか?

はい、コマンドデザインパターンは、マルチスレッドプログラミングで非常に役立ちます。これにより、リクエストをオブジェクトにカプセル化することができ、それを別々のスレッドで実行できます。これにより、スレッドの同期を大幅に簡素化できます。

コマンドデザインパターンとオブジェクト指向のデザインの原則との関係は何ですか?

コマンドデザインパターンは、カプセル化の良い例です。これは、オブジェクト指向設計の基本原則の1つです。リクエストをオブジェクトにカプセル化し、さまざまなリクエストでクライアントをパラメーター化できるようにします。

コマンドデザインパターンを使用することの欠点は何ですか?

コマンドデザインパターンには多くの利点がありますが、欠点がないわけではありません。主な欠点は、各コマンドが個別のクラスで表されるため、クラスの数が増加することです。これにより、システムがより複雑で理解が困難になります。

以上がコマンド設計パターンを理解するの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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