=====Description====
Un objet (observable) contient des informations ou des actions que d'autres objets (observateurs) souhaiteraient connaître en cas de modification ou d'appel.
{{:helloworld:design_pattern:observer:observerpattern.png|Diagramme UML Observateur}}
[[https://www.protechtraining.com/bookshelf/java_fundamentals_tutorial/design_patterns?ncr=1|Java Fundamentals Tutorial_ Design Patterns]] {{ :helloworld:design_pattern:java_fundamentals_tutorial_design_patterns_2020-04-29_9_59_57_pm_.html |Archive le 29/04/2020}}
=====Code=====
====Java====
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);
}
}
====C++====
===Liste avec shared_ptr===
#include
#include
#include
#include
class Observer {
public:
~Observer() { std::cout << "~Observer\n"; }
void call() { std::cout << "Call\n"; }
};
class Observable {
public:
std::vector> listener;
void call() {
listener.erase(std::remove_if(listener.begin(), listener.end(),
[](std::weak_ptr 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();
Observable observable;
observable.listener.push_back(observer);
observable.call();
observer = nullptr;
observable.call();
std::cout << "END\n";
}
Résultat:
Call
~Observer
Fails
END