concept

Define a one-to-many relationship between objects so that when an object changes state, all dependent objects are notified and updated automatically. The advantage is that the observed and the observer are abstractly coupled, which improves the flexibility of the system. The disadvantage is that the development and debugging become complicated, and the Java message notification is executed sequentially by default. One observer delay will affect the overall execution efficiency, so the asynchronous form is generally adopted.

Usage scenarios

  • Associated behavior scenarios (not combinations)
  • Multi-level event triggering scenario
  • Cross-system message exchange, such as message queues, event bus processing mechanisms

implementation

  • Subject — Abstract Subject: An Observable that stores references to all observer objects in a collection and provides an interface for adding and deleting observers.
  • ConcreteSubject – Concrete topic concrete observed
  • Observer – An abstract Observer defines an update interface that notifies itself of a topic’s status update when it changes.
  • Observables and Observables are JDK built-in types, so we can write concrete implementation classes directly
Observable Observable Observable Observable Observable Observable Observable Observable Observable Observable Observable Observable Observable; // unRegisterObserver void unRegisterObserver(Observer Observer); // Update data void notifyObservers(); } /** * interface Observer {void update(Observable Observable, Object value); } /** * public class implements Observable {List<Observer> observerList; private int progress; publicMyView() {
            this.observerList = new ArrayList<>();
        }

        @Override
        public void registerObserver(Observer observer) {
            if (observerList.contains(observer)) {
                return;
            }
            observerList.add(observer);
        }

        @Override
        public void unRegisterObserver(Observer observer) {
            int i = observerList.indexOf(observer);
            if (i >= 0) {
                observerList.remove(observer);
            }
        }

        @Override
        public void notifyObservers() {
            for (Observer observer : observerList) {
                observer.update(this, progress);
            }
        }

        public void setProgress(int progress) { this.progress = progress; notifyObservers(); }} public class listener implements Observer {@override public void update(Observable) observable, Object value) { System.out.println("progress = " + value);
        }
    }

    public static void main(String[] args) {
        MyView myView = new MyView();
        Observer progressListener = new ProgressListener();
        myView.registerObserver(progressListener);
        myView.setProgress(10);
    }
Copy the code