┌─────────────────────────────┐ │ <<interface>> │ │ Observer │ ← Observer ├─────────────────────────────┤ │ + update(Observable): void │ └─────────────────────────────┘ △ │ implements │ ┌─────────────────────────────┐ │ Client │ ← Concrete Observer ├─────────────────────────────┤ │ - id: String │ │ + Client(String) │ │ + update(Observable): void │ └─────────────────────────────┘ ┌─────────────────────────────┐ │ <<abstract>> │ │ Observable │ ← Subject ├─────────────────────────────┤ │ - observers: List<Observer> │ │ + add(Observer): void │ │ + remove(Observer): void │ │ + notifyObservers(): void │ │ + getId(): String │ └─────────────────────────────┘ △ │ extends │ ┌─────────────────────────────┐ │ Server │ ← Concrete Subject ├─────────────────────────────┤ │ - id: String │ │ - state: Boolean │ │ + Server(String, Boolean) │ │ + setState(boolean): void │ │ + getState(): boolean │ └─────────────────────────────┘
Observer Interface
:public interface Observer { void update(final Observable observable); }
Concrete Observer
:public class Client implements Observer { private final String id; public Client(final String id) { this.id = id; } public String getId() { return id; } public void update(final Observable observable) { if (observable instanceof Server) { Server server = (Server) observable; System.out.println("[Client '" + id + "'] Server '" + server.getId() + "' - State: " + server.getState()); } } }
Abstract Subject
:public abstract class Observable { final List<Observer> observers = new ArrayList<>(); public void add(final Observer observer) { observers.add(observer); } public void remove(final Observer observer) { observers.remove(observer); } public void notifyObservers() { for (final Observer observer : observers) { observer.update(this); } } public abstract String getId(); }
Concrete Subject
:public class Server extends Observable { private final String id; private Boolean state; public Server(final String id, final Boolean state) { this.id = id; this.state = state; } public String getId() { return id; } public boolean getState() { return state; } public void setState(final boolean state) { this.state = state; notifyObservers(); } }
public class ObserverPatternTest { public static void main(String[] args) { final Server server1 = new Server("server1", Boolean.TRUE); final Client client1 = new Client("client1"); final Client client2 = new Client("client2"); // add observers server1.add(client1); server1.add(client2); // notify observers: client1, client2 System.out.println("-- Notify observers:"); server1.setState(Boolean.FALSE); // remove observer: client2 System.out.println("-- Remove observers: client2"); server1.remove(client2); // notify observers: client1 System.out.println("-- Notify observers:"); server1.setState(Boolean.TRUE); } }