オブザーバーパターン


つのオブジェクトが状態を変更すると、すべての依存関係が通知され、自動的に更新されるように、オブジェクト間の1対多依存性を定義します.

参加者


サブジェクト:そのオブザーバーを知っている.オブザーバーオブジェクトの任意の数は、被写体を観察することができます.オブザーバーオブジェクトをアタッチして分離するインターフェイスを提供します.
  • 具体的なObjectObject:具体的オブザーバーへの関心の状態を格納します.その状態が
  • のとき、そのオブザーバーに通知を送ります
  • Observer :対象の変更を通知するオブジェクトの更新インターフェイスを定義します.
  • ArticteObserver :具体的なオブジェクトオブジェクトへのリファレンスを保持します.対象との状態を維持する必要があります状態を格納します.オブザーバーの更新インターフェイスを実装し、その状態を対象と一致させ続けます.

    コード


    public class Main {
    
        public static void main(String[] args) {
            ConcreteSubject s = new ConcreteSubject();
            s.attach(new ConcreteObserver(s, "X"));
            s.attach(new ConcreteObserver(s, "Y"));
            s.attach(new ConcreteObserver(s, "Z"));
            s.setSubjectState("ABC");
            s.notifyObservers();
        }
    }
    
    public class Subject {
    
        private List<Observer> observers = new ArrayList<>();
    
        public void attach(Observer observer) {
            observers.add(observer);
        }
    
        public void detach(Observer observer) {
            observers.remove(observer);
        }
    
        public void notifyObservers() {
            for (Observer o : observers) {
                o.update();
            }
        }
    }
    
    public class ConcreteSubject extends Subject {
    
        private String subjectState;
    
        public String getSubjectState() {
            return subjectState;
        }
    
        public void setSubjectState(String subjectState) {
            this.subjectState = subjectState;
        }    
    }
    
    public interface Observer {
    
        void update();
    }
    
    public class ConcreteObserver implements Observer {
    
        private String name;
        private ConcreteSubject subject;
    
        public ConcreteObserver(ConcreteSubject subject, String name) {
            this.subject = subject;
            this.name = name;
        }
    
        @Override
        public void update() {
            String observerState = subject.getSubjectState();
            System.out.println("Observer " + name + " state is " + observerState);
        }
    }
    

    出力


    Observer X state is ABC
    Observer Y state is ABC
    Observer Z state is ABC
    

    Java組み込みオブザーバ


    public class Main {
    
        public static void main(String[] args) {
            ConcreteSubject s = new ConcreteSubject();
            s.addObserver(new ConcreteObserver(s, "X"));
            s.addObserver(new ConcreteObserver(s, "Y"));
            s.addObserver(new ConcreteObserver(s, "Z"));
            s.setSubjectState("ABC");
            s.notifyObservers();
        }
    }
    
    import java.util.Observable;
    
    public class ConcreteSubject extends Observable {
    
        private String subjectState;
    
        public String getSubjectState() {
            return subjectState;
        }
    
        public void setSubjectState(String subjectState) {
            this.subjectState = subjectState;
            setChanged();
        }
    
    }
    
    import java.util.Observable;
    import java.util.Observer;
    
    public class ConcreteObserver implements Observer {
    
        Observable subject;
        private String name;
    
        public ConcreteObserver(Observable subject, String name) {
            this.subject = subject;
            this.name = name;
        }
    
        @Override
        public void update(Observable obs, Object arg) {
            if(obs instanceof ConcreteSubject) {
                ConcreteSubject observable = (ConcreteSubject)obs;
                System.out.println("Observer " + name + " state is " + observable.getSubjectState());
            }       
        }
    }
    

    エディエルジュリアン61 / デザインパターン