デザイン パターン オブザーバー パターン - C++

オブザーバー パターン: オブジェクト間の 1 対多の依存関係を定義します。オブジェクトの状態が変化すると、そのすべての依存関係が通知され、自動的に更新されます。

オブザーバーの定義を通じて、データを提供するオブジェクトが存在すること、およびそれぞれのアクティビティを実行するためにこのデータを必要とする他の多くのオブジェクトが存在することがわかります。観測者モードを説明するために気象状況を例に挙げてみましょう。

私たちには気象状況にアクセスする必要がある部門がたくさんあり、彼らは私たちの監視員です。そして、天気は私たちが観測するものであり、天気が変わるときは、観測者全員に知らせる必要があります。

オブザーバー パターンでは、次のクラスが必要です。

1. テーマカテゴリ。主にオブザーバーの登録、データ変更時のオブザーバーへの通知、オブザーバーのキャンセルを実装します。

クラス主語父

{

        公共:

        void registerObserver(ObserverFather *ob); // オブザーバーを登録します

        void deleteObserver(ObserverFather *ob); // オブザーバーをログアウトします

        void notificationObserver(); //オブザーバーに通知する

        プライベート:

        std::vector<ObserverFather *> m_observerVector; //登録された各オブザーバー オブジェクトを格納します。

};

void SubjectFather::registerObserver(ObserverFather *ob)

{

        m_observerVector.push_back(ob);

}

void SubjectFather::notifyObserver() // オブザーバーに通知します

{

        std::vector<ObserverFather *>::iterator iter;

        for(iter = m_observerVector.begin();iter!=m_observerVector.end();iter++)

                (*iter)->updata();//各オブザーバーの更新関数を呼び出して処理します。

}

2. 抽象オブザーバー基本クラス。主な機能は、親クラスを通じてさまざまなサブクラスを指すことであり、テーマが変更されると、更新を通じて各オブザーバーに渡されます。これはサブジェクトとサブオブザーバーの両方で使用されるクラスで、主にサブジェクトが各サブオブザーバーを指すために使用し、サブオブザーバーが主にこれを継承します。

クラスObserverFather

{

        公共:

        オブザーバーファーザー(){}

        ~ObserverFather(){}

        virtual void updata() = 0;//データをクラスにカプセル化することを検討できます。ここでは、カプセル化されたクラスのオブジェクトが渡されます。特定の各オブザーバーでは、対応するデータはデータ クラスを通じて取得できます。

};

3. オブザーバー基本クラスを継承する特定のオブザーバー。

クラス FirstObserver : public ObserverFather

{

        公共:

        FirstObserver(SubjectFather *subject); //オブジェクトが構築されたら、オブジェクトをテーマに登録します。

        ~FirstObserver(SubjectFather *subject); //このオブジェクトをサブジェクトから登録解除します

        void update();

};

FirstObserver::FirstObserver(SubjectFather *subject)

{

        subject->registerObserver(this); //登録する

}

 void FirstObserver::updata()

  {

        //通知を受け取り、特定の操作を実行します

   }

4. 簡単な例:

 int main()

{

        SubjectFather *subject = new SubjectFather();

        FirstObserver *first = 新しい FirstObserver(件名);

        subject->notifyObserver(); //件名が変更されたときに各オブザーバーに通知します

        0を返します。

}

おすすめ

転載: blog.csdn.net/dreamliweiming/article/details/127843637