第 21 条: 中間モード: オブジェクト間の相互作用の分離

第 21 条: 「メディター パターン: オブジェクト間の相互作用の分離」

この記事を始める前に、AI アシスタント ツールの助けを借りて、半分の労力で学習できる便利な学習ツール AIRight をお勧めします。ようこそ: http://airright.fun/。

さらに、デザインパターンに関する優れた資料が 2 つありますので、参考にしてください。
リンク: https://pan.baidu.com/s/1RmhQF_o1CdK8U7s5KeILog?pwd=xc6d
抽出コード: xc6d

デザイン パターンはソフトウェア開発における重要な知識です。メディエーター パターンは、オブジェクト間の相互作用を分離するために使用される動作デザイン パターンであり、これによりオブジェクト間の直接の依存関係が減り、柔軟性と保守性が向上します。この記事では、メディエーター パターンの役割と実装について説明し、C++ でメディエーター パターンを適用してオブジェクト間の相互作用を分離する方法を示します。

1. 中間モデルの役割:

中間モードの役割は、中間オブジェクトを導入することでオブジェクト間の対話を管理し、オブジェクトが互いに直接通信するのではなく、仲介者を介して通信することで、システム内のオブジェクト間の結合関係を最小限に抑えることです。Mediator パターンには、次の中心的な役割が含まれています。

  • Abstract Mediator (Abstract Mediator): オブジェクト間の対話を管理するために使用されるメディエーター オブジェクトのインターフェイスを定義します。
  • 具体的なメディエーター: 抽象的なメディエーター インターフェイスを実装し、さまざまな同僚間の対話を調整する責任を負います。
  • Abstract Colleague (Abstract Colleague): メディエータと通信するための Colleague クラスのインターフェイスを定義します。
  • Concrete Colleague (Concrete Colleague): 抽象同僚クラス インターフェイスを実装し、他の同僚クラスとの通信を担当します。

メディエーター パターンの鍵は、オブジェクト間の対話ロジックをメディエーター オブジェクトに集中させ、各オブジェクトが他のオブジェクトの存在を認識せずに自分のロジックのみを考慮するようにすることです。

2. 中間モードの実装:

中間モードの実装は通常、次の手順に分かれています。

  • 抽象メディエーター クラスを定義する: 抽象メディエーター クラス内の他のオブジェクト間の対話を調整するためのメソッドを宣言します。
  • 抽象同僚クラスを定義する: 抽象同僚クラスでメディエーターと通信するために使用するメソッドを宣言します。
  • 特定の中間クラスを定義します。同僚間の対話を調整する役割を担う抽象中間クラス インターフェイスを実装します。
  • 具体的な同僚クラスを定義します。抽象的な同僚クラス インターフェイスを実装し、他の同僚オブジェクトとの通信を担当し、必要に応じて中間オブジェクトを介して対話します。

3. C++ でメディエーター パターンを適用します。

以下は Mediator パターンの C++ サンプル コードです。

a. 抽象メディエーター クラスを定義します。

// Mediator.h
class Colleague;

class Mediator {
    
    
public:
    virtual ~Mediator() {
    
    }
    virtual void sendMessage(const std::string& message, Colleague* colleague) = 0;
};

b. 抽象同僚クラスを定義します。

// Colleague.h
#include <string>

class Mediator;

class Colleague {
    
    
public:
    Colleague(Mediator* mediator) : mediator_(mediator) {
    
    }
    virtual ~Colleague() {
    
    }
    virtual void receiveMessage(const std::string& message) = 0;
    virtual void sendMessage(const std::string& message) {
    
    
        mediator_->sendMessage(message, this);
    }

protected:
    Mediator* mediator_;
};

c. 具​​体的なメディエーター クラスを定義します。

// ConcreteMediator.h
#include <iostream>
#include "Mediator.h"
#include "Colleague.h"

class ConcreteMediator : public Mediator {
    
    
public:
    void sendMessage(const std::string& message, Colleague* colleague) override {
    
    
        if (colleague == colleagueA_) {
    
    
            colleagueB_->receiveMessage(message);
        } else if (colleague == colleagueB_) {
    
    
            colleagueA_->receiveMessage(message);
        }
    }

    void setColleagueA(Colleague* colleagueA) {
    
    
        colleagueA_ = colleagueA;
    }

    void setColleagueB(Colleague* colleagueB) {
    
    
        colleagueB_ = colleagueB;
    }

private:
    Colleague* colleagueA_;
    Colleague* colleagueB_;
};

d. 特定の同僚クラスを定義します。

// ConcreteColleague.h
#include <iostream>
#include "Colleague.h"

class ConcreteColleagueA : public Colleague {
    
    
public:
    ConcreteColleagueA(Mediator* mediator) : Colleague(mediator) {
    
    }

    void receiveMessage(const std::string& message) override {
    
    
        std::cout << "ConcreteColleagueA received message: " << message << std::endl;
    }
};

class ConcreteColleagueB : public Colleague {
    
    
public:
    ConcreteColleagueB(Mediator* mediator) : Colleague(mediator) {
    
    }

    void receiveMessage(const std::string& message) override {
    
    
        std::cout << "ConcreteColleagueB received message: " << message << std::endl;
    }
};

e. クライアントは以下を使用します。

// main.cpp
#include "ConcreteMediator.h"
#include "ConcreteColleague.h"

int main() {
    
    
    ConcreteMediator mediator;
    ConcreteColleagueA colleagueA(&mediator);
    ConcreteColleagueB colleagueB(&mediator);

    mediator.setColleagueA(&colleagueA);
    mediator.setColleagueB(&colleagueB);

    colleagueA.sendMessage("Hello from ConcreteColleagueA!");
    colleagueB.sendMessage("Hi from ConcreteColleagueB!");

    return 0;
}

4. 中間モードのコード分析:

メディエーター モードでは、メディエーター オブジェクトを導入することにより、オブジェクト間の対話ロジックがメディエーター オブジェクトに集中され、オブジェクト同士が直接通信することがなくなります。クライアントは中間オブジェクトを介してオブジェクト間で通信し、オブジェクト間の分離を実現します。

5. ベストプラクティス:

メディエーター パターンを使用する場合は、次の点に注意する必要があります。

  • 中間インターフェイスを合理的に設計する: 中間インターフェイスでは、特定の同僚クラスがそれぞれ仲介インターフェイスを介して通信できるように、統一された通信方法を定義する必要があります。
  • オブジェクト間の依存関係: メディエーター パターンを使用すると、メディエーター オブジェクトの責任が重くなる可能性があるため、メディエーター オブジェクトが過度に複雑な「神のオブジェクト」にならないようにする必要があります。

**

  1. 要約:**

中間パターンは重要な設計パターンであり、中間オブジェクトを導入することでオブジェクト間の相互作用を切り離し、システム内のオブジェクト間の結合関係を軽減します。C++ では、抽象メディエーター クラスと具象メディエーター クラスを通じてメディエーター パターンを実装できます。中間モードは、オブジェクト間の複雑な相互作用と高度な結合を伴うシナリオに特に適しており、コードの柔軟性と保守性を向上させることができます。

この記事が、中間パターンの役割と実装を理解するのに役立ち、C++ のサンプル コードを通じて C++ で中間パターンを適用してオブジェクト間の相互作用を分離する方法を説明するのに役立つことを願っています。設計パターンはソフトウェア開発における重要な知識であり、さまざまな設計パターンを習得することは、コードの品質、保守性、拡張性の向上に役立ちます。

参考文献:

  • ガンマ E.、ヘルム R.、ジョンソン R.、および Vlissides J. (1994)。デザイン パターン: 再利用可能なオブジェクト指向ソフトウェアの要素。アディソン・ウェスリー・プロフェッショナル。
  • C++ コア ガイドライン: https://isocpp.github.io/CppCoreguidelines/CppCoreguidelines

読んでいただきありがとうございます。一緒に議論し、進歩することを歓迎します。学習プロセスの質問に答えるには、学習アシスタント AIRight を使用することをお勧めします。リンクにアクセスしてください: http://airright.fun/

おすすめ

転載: blog.csdn.net/Jake_cai/article/details/132144142