設計モード(3)観察者モード(説明+応用)


  • オブザーバモード
  • なぜオブザーバーモードを使用しますか?
  • オブザーバモード適用例
  • オブザーバモード
    オブザーバモード:サブスクライバモードとも呼ばれ、1つのオブジェクトによって依存するマルチオブジェクトを管理し、オブジェクトの状態が変化すると依存するオブジェクトを自発的に通知します.私たちのバックグラウンドデータの変化がフロントviewの更新によく使われています.
    利点:トピックと依存トピックの観察者間を緩やかに結合させ、論理層と表現層の分離を実現する
    なぜオブザーバーモードを使用しますか?
    前のゲームのデザインを続けると、それぞれのゲームのキャラクターに魔法を表す青い棒があり、スキルを解放すると消耗し、同時に赤い棒が血の量を表し、攻撃されると赤い棒が減少し、英雄がプレイヤーに操られ、戦闘を行うと、赤い棒と青い棒は戦闘の進行に伴って要求が絶えず変化します.このようにユーザーにより良い体験を与えることで、ユーザーはリアルタイムの状況に応じて適切な操作を選択したり、逃げたり、戦いを続けたりすることができます.同時に、英雄の他の情報に対して、スクリーンの他の場所で表示する必要があります.この時、私たちはリアルタイムでこれらの情報を取得する必要があります.私たちはまず、ポーリングのメカニズムを採用することを考えているかもしれません.データベースまたは他のストレージ領域のデータをアクティブに取得します.しかし、私たちの開発ではこのような方法は使用されません.まずポーリングは相対的に消費されています.また、英雄一人一人にコードを書いて情報を取得しなければなりません.もし私たちがそれを修正するなら、この時、私たちはそれを開く必要があります.それからそれを修正する必要があります.間違いを犯す機会が増えるに違いありません.具体的なデータを取得するコードと、私たちがデータを表示するコードが混在しています.このとき、私たちはオブザーバーモードを使用して、私たちのView層とデータの取得を分け、オブザーバーモードを使用して、私たちはクラスを通じてデータ管理クラスとして使用し、インタフェースの各viewを定義してこのインタフェースを実現する必要があります.インタフェースを通じてデータ管理クラスとインタラクティブになり、同時に実現することができ、データが変化した後に更新され、view層は受動的にデータを取得し、積極的にデータをつかむ必要はありません.コードで説明します.
    public interface Data{
    //       
        public void registerObserver(Observer o);
    //       
        public void removeObserver(Observer o);
    //          
        public void notifyObservers();
    //    
        public void dataChanged();
    }
    //    
    public interface Observer{
    //        
        public void updata(int blood,int energy);
    //    
        public void display();
    }

    上のコードは大体オブザーバーモードの構造で、バックグラウンドのデータに対して、私たちは変化管理クラスを設定して、もし私のデータにアクセスする必要があるならば、インタフェースの形式を通じて、登録関数を呼び出すことを通じて、依存インスタンスをデータオブジェクトに注入して、それから、私たちのデータクラスのオブジェクトが変化した後、私たちは通知方法を呼び出します.次に、メソッド内の関数がオブジェクトのキューに依存することを通知します.これにより、データが変化すると、各コンポーネントは最新の更新データを受動的に取得できます.
    オブザーバの適用例
    オブザーバーアプリケーションの例では、Viewではオブザーバーモードが多く使用されています.私たちが見ることができるコントロールとコントロールに対するリスニングイベントでは、通常、このオブザーバーモードを使用しています.コントロールにリスニング者を設定すると、私たちのコントロールがタッチされると、リスニング者はアクティブにトリガーされ、対応する操作を実行します.例えばButton.
    public class MyActivity extends Activity {
         protected void onCreate(Bundle icicle) {
             super.onCreate(icicle);
    
             setContentView(R.layout.content_layout_id);
    
             final Button button = (Button) findViewById(R.id.button_id);
             button.setOnClickListener(new View.OnClickListener() {
                 public void onClick(View v) {
                     // Perform action on click
                 }
             });
         }
     }

    ここでのbuttonは我々のテーマと見なすことができ,ここで傍受者は匿名内部クラスの形式でsetOnClickListenerの形式で注入され,このときbuttonにクリックイベントがあると傍受者が通知され,傍受者のocClick方法が自発的に呼び出され,ButtonはTextViewから継承され,TextViewはViewから継承され,Viewには傍受者キューがあり,イベントがトリガーされると、キュー内のリスナーが受動的にトリガーされます.具体的なViewソースコードとトリガコードは,ここではデモを継続せず,主にこの例を用いて観察者モードの実際の価値と用途をさらに理解するのに役立つ.
    後編では、単例モードについて説明します.