Un objet (observable) contient des informations ou des actions que d'autres objets (observateurs) souhaiteraient connaître en cas de modification ou d'appel.
Java Fundamentals Tutorial_ Design Patterns Archive le 29/04/2020
Les interfaces et classes abstraites sont déjà implémentées dans Java.
package observer; import java.util.Observable; public class BeanObservable extends Observable { private int nb; public int getNb() { return nb; } public void setNb(int nb) { this.nb = nb; setChanged(); // C'est notifyObservers qui appelle clearChanged(); notifyObservers(); } }
package observer; import java.util.Observable; import java.util.Observer; public class Observateur implements Observer { @Override public void update(Observable o, Object arg) { System.out.println("Nouvelle valeur détectée : " + ((BeanObservable)o).getNb()); } }
package observer; public class Main { public static void main(String[] args) { // On crée l'observé et les deux observateurs BeanObservable bean = new BeanObservable(); Observateur ob1 = new Observateur(); Observateur ob2 = new Observateur(); // On lit l'observé aux observateurs bean.addObserver(ob1); bean.addObserver(ob2); // On change une valeur pour générer l'événement bean.setNb(10); } }
#include <algorithm> #include <iostream> #include <memory> #include <vector> class Observer { public: ~Observer() { std::cout << "~Observer\n"; } void call() { std::cout << "Call\n"; } }; class Observable { public: std::vector<std::weak_ptr<Observer>> listener; void call() { listener.erase(std::remove_if(listener.begin(), listener.end(), [](std::weak_ptr<Observer> obs) -> bool { auto ob = obs.lock(); if (ob) { ob->call(); return false; } else { std::cout << "Fails\n"; return true; } }), listener.end()); } }; int main() { auto observer = std::make_shared<Observer>(); Observable observable; observable.listener.push_back(observer); observable.call(); observer = nullptr; observable.call(); std::cout << "END\n"; }
Résultat:
Call ~Observer Fails END