publish - Subscribe

3081 ワード

一例導入
  • オブザーバインタフェース
  • package subpub.interface_;
    public interface Observer {
        public void update(Subscribe sub);
        public boolean isInterested();
    }
    
  • 購読者インタフェース
  • package subpub.interface_;
    
    import java.util.ArrayList;
    import java.util.List;
    public interface Subscribe {
        List observers = new ArrayList<>();
        public void append(Observer observer);
        public void remove(Observer observer);
        public void myNotify();
    }
    
  • アナウンサー(パブリッシャインタフェースの実装)
  • package subpub.interface_;
    public class Anchor implements Subscribe{
       private String anName;
    
        public boolean isOnline() {
            return online;
        }
    
        public void setOnline() {
            this.online = true;
            myNotify();
        }
    
        private boolean online;
        public Anchor(String anName,boolean online) {
            this.anName = anName;
            this.online = online;
        }
    
        public String getAnName() {
            return anName;
        }
    
        public void setAnName(String anName) {
            this.anName = anName;
        }
        @Override
        public void append(Observer observer){
            observers.add(observer);
        }
        @Override
        public void remove(Observer observer){
            observers.remove(observer);
        }
        @Override
        public void myNotify() {
            for (Observer observer:observers) {
                if(observer.isInterested()){
                    observer.update(this);
                }
            }
        }
    }
    
  • 購読視聴者(観察者のインタフェースを実現する)
  • package subpub.interface_;
    
    /**
     * Created by liqiushi on 2017/11/22.
     */
    public class Audience implements Observer {
        private String auName;
        Subscribe sub ;
        private boolean interested;
        public void setInterested(boolean interested) {
            this.interested = interested;
        }
    
    
        public Audience(String auName,Subscribe sub) {
            this.auName = auName;
            this.sub =sub;
            sub.append(this);
        }
    
        @Override
        public void update(Subscribe sub) {
            System.out.println("   " + this.auName + ":" + ((Anchor) sub).getAnName() + "     !");
        }
    
        @Override
        public boolean isInterested() {
            return interested;
        }
    }
    
    
    
  • test
  • package subpub;
    
    import subpub.interface_.Anchor;
    import subpub.interface_.Audience;
    import subpub.interface_.Observer;
    import subpub.interface_.Subscribe;
    public class TestMain {
        public static void main(String[] args) {
              Subscribe subscribe = new Anchor("   ",false);
            Observer childAu = new Audience("   ",subscribe);
            Observer womanAu = new Audience("   ",subscribe);
            ((Audience)childAu).setInterested(true);
            ((Anchor)subscribe).setOnline();
          
        }
    }
    //      :        !
    

    なぜ観察者モードを使うのか、観察者モードでシーンを適用するのか
  • 抽象モデルに2つの態様がある場合、一方の態様の動作は他方の態様の状態変化
  • に依存する.
  • オブジェクトを変更する場合、同時に他のオブジェクトを変更する必要があり、どのくらいのオブジェクトが連帯変更されるべきか分からない
  • .
  • オブジェクトが他のオブジェクトに通知する必要がある場合、このオブジェクトと他のオブジェクトがばらばら結合
  • であることを望んでいます.