デザインパターンGOF23オブザーバモード

Observerパターンのオブザーバー

ブロードキャストメカニズム

シーン:複数のオブザーバー-変更を通知します

文字は皆のためのマップ上の変更、更新された座標を座標移動CS

コア:ターゲットオブジェクト(件名)ステータス値が変化し、必要が迅速に対応するためにそれらを可能にするために、すべてのオブザーバ(オブザーバー)を通知します

一般的なシナリオの開発:

- チャットルームの手続き、すべてのクライアントへのサーバーに転送

- オンラインゲーム(多人数)、サーバは、各プレイヤーの状態を配布します

- Eメールサブスクリプション

-Servlet、感知機構

ブロードキャスト・メカニズム-Android

モデルを扱うAWTイベントの-jdkは、デリゲートのイベントモデルオブザーバモード(委任イベントモデル)に基づいて(イベントソース------対象オブジェクト、イベントリスナー------オブザーバー)

- Jingdongモール、量販割引情報

パブリッククラス件名{
 //被观察者队伍
  保護された一覧<オブザーバー>オブザーバー=新しいArrayListを<>();
  公共ボイドaddObserver(観察者OBS){
   observers.add(OBS)。
  }
  公共ボイドremoveObserver(観察者OBS){
   observers.remove(OBS)。
  }
  //通知所有被观察者的状态更新
  公共ボイドnotifyAllObserve(){
   (観察者OBS:オブザーバー)のために{
    obs.update()。
   }
  }
}
クラスConcreteSub件名{延び
 プライベートINT状態を、
 公共のint getStateを(){
  状態を返します。
 }
 公共ボイドSETSTATE(INT状態){
  this.state =状態。
  this.notifyAllObserve();
 }
}

public interface Observer {
  void update();
}
class ObserverA implements Observer{
 private int myState;
 private Subject sub;
 public ObserverA(Subject sub) {
  this.sub = sub;
 }
 @Override
 public void update() {
  myState=((ConcreteSub)sub).getState();
  System.out.println("状态已更新");
 }
 
}
public class Client {
public static void main(String[] args) {
 ConcreteSub sub=new ConcreteSub();
 ObserverA obs1=new ObserverA(sub);
 ObserverA obs2=new ObserverA(sub);
 ObserverA obs3=new ObserverA(sub);
 //添加到被观察者队伍
 sub.addObserver(obs1);
 sub.addObserver(obs2);
 sub.addObserver(obs3);
 
 sub.setState(1000);
}
}
#####################################手动分隔符##############################################
java.util.Observable(相当于上面定义的Subject类)和java.util.Observer(相当于上面定义的Observer接口)
public class ConcreteSubject extends Observable{
  private int state;
  public void set(int s) {
   state=s;
   setChanged();
   this.notifyObservers();
  }
public int getState() {
 return state;
}
public void setState(int state) {
 this.state = state;
}
 
}
public class ObserverA implements Observer{
  private int myState;
 @Override
 public void update(Observable o, Object arg) {
  myState=((ConcreteSubject)o).getState();
 }
 public int getMyState() {
  return myState;
 }
 public void setMyState(int myState) {
  this.myState = myState;
 }
 
}
public class Client {
public static void main(String[] args) {
 ConcreteSubject cs=new ConcreteSubject();
 ObserverA obs1=new ObserverA();
 ObserverA obs2=new ObserverA();
 ObserverA obs3=new ObserverA();
 //添加至队伍中
 cs.addObserver(obs1);
 cs.addObserver(obs2);
 cs.addObserver(obs3);
 
 cs.set(100);
 
 System.out.println(obs1.getMyState());
 System.out.println(obs2.getMyState());
 System.out.println(obs2.getMyState());
 
}
}

おすすめ

転載: www.cnblogs.com/code-fun/p/11366508.html