Java design pattern observer pattern

Posted by ScoTi on Tue, 31 Mar 2020 13:04:53 +0200

The observer mode is the publish subscribe mode. The publisher publishes information and the subscriber obtains information. When a publisher changes its state, subscribers who depend on it are notified and automatically updated.

Role partition

Abstract observer role: provides an interface for adding, deleting, and notifying observers.
Specific role of the observed: save all the observed objects with a set to realize the function of adding, deleting and notifying the observer.
Abstract observer role: define an interface for all concrete observers and update themselves when they are notified of a topic.
Specific observer role: the update interface needed to implement the abstract observer role.

Class diagram

Code example

Abstract observer role: observable

public interface Obverable {
    public void registObserver(Observer observer);
    public void removeObserver(Observer observer);
    public void notifyObserver();
}

Specific observed role: Magazine

public class Magazine implements Obverable {

    private List<Observer> observers = new ArrayList<Observer>();
    private String msg;

    @Override
    public void registObserver(Observer observer) {
        observers.add(observer);
    }

    @Override
    public void removeObserver(Observer observer) {
        observers.remove(observer);
    }

    @Override
    public void notifyObserver() {
        for (Observer observer: observers) {
            observer.update(msg);
        }
    }

    public void publishNews(String msg) {
        this.msg = msg;
        this.notifyObserver();
    }
}

Abstract Observer role: Observer

public interface Observer {
    public void update(String msg);
}

Specific observer roles: reader a, reader B, reader C

public class ReaderA implements Observer {
    @Override
    public void update(String msg) {
        System.out.println("ReaderA, msg="+msg);
    }
}
public class ReaderB implements Observer {
    @Override
    public void update(String msg) {
        System.out.println("ReaderB, msg="+msg);
    }
}
public class ReaderC implements Observer {
    @Override
    public void update(String msg) {
        System.out.println("ReaderC, msg="+msg);
    }
}

Call Magazine in ObserverTest and register Reader. After Magazine releases the message, each Reader can receive the message.

public class ObserverTest {

    public static void main(String[] args) {
        Magazine magazine = new Magazine();
        ReaderA readerA = new ReaderA();
        ReaderB readerB = new ReaderB();
        ReaderC readerC = new ReaderC();
        magazine.registObserver(readerA);
        magazine.registObserver(readerB);
        magazine.registObserver(readerC);
        magazine.publishNews("msg1");
        magazine.removeObserver(readerA);
        magazine.publishNews("msg2");
    }
}

The operation results are as follows:
ReaderA, msg=msg1
ReaderB, msg=msg1
ReaderC, msg=msg1
ReaderB, msg=msg2
ReaderC, msg=msg2