helloworld:design_pattern:observer
Différences
Ci-dessous, les différences entre deux révisions de la page.
Les deux révisions précédentesRévision précédenteProchaine révision | Révision précédente | ||
helloworld:design_pattern:observer [2020/05/10 23:51] – Suppression de la taille par défaut pour les images root | helloworld:design_pattern:observer [2022/10/07 09:58] (Version actuelle) – Ajout d'un exemple en C++ root | ||
---|---|---|---|
Ligne 1: | Ligne 1: | ||
+ | =====Description==== | ||
+ | |||
Un objet (observable) contient des informations ou des actions que d' | Un objet (observable) contient des informations ou des actions que d' | ||
Ligne 5: | Ligne 7: | ||
[[https:// | [[https:// | ||
- | [[helloworld:design_pattern:observer:java|Java]] | + | =====Code===== |
+ | |||
+ | ====Java==== | ||
+ | |||
+ | Les interfaces et classes abstraites sont déjà implémentées dans Java. | ||
+ | |||
+ | <file java BeanObservable.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(); | ||
+ | } | ||
+ | } | ||
+ | </ | ||
+ | |||
+ | <file java Observateur.java> | ||
+ | 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(" | ||
+ | } | ||
+ | } | ||
+ | </ | ||
+ | |||
+ | <file java Main.java> | ||
+ | package observer; | ||
+ | |||
+ | public class Main { | ||
+ | public static void main(String[] args) { | ||
+ | // On crée l' | ||
+ | BeanObservable bean = new BeanObservable(); | ||
+ | Observateur ob1 = new Observateur(); | ||
+ | Observateur ob2 = new Observateur(); | ||
+ | |||
+ | // On lit l' | ||
+ | bean.addObserver(ob1); | ||
+ | bean.addObserver(ob2); | ||
+ | |||
+ | // On change une valeur pour générer l' | ||
+ | bean.setNb(10); | ||
+ | } | ||
+ | } | ||
+ | </ | ||
+ | |||
+ | ====C++==== | ||
+ | |||
+ | ===Liste avec shared_ptr=== | ||
+ | |||
+ | <code cpp> | ||
+ | #include < | ||
+ | #include < | ||
+ | #include < | ||
+ | #include < | ||
+ | |||
+ | class Observer { | ||
+ | | ||
+ | ~Observer() { std::cout << " | ||
+ | void call() { std::cout << " | ||
+ | }; | ||
+ | |||
+ | class Observable { | ||
+ | | ||
+ | std:: | ||
+ | void call() { | ||
+ | listener.erase(std:: | ||
+ | | ||
+ | auto ob = obs.lock(); | ||
+ | if (ob) { | ||
+ | ob-> | ||
+ | return false; | ||
+ | } else { | ||
+ | std::cout << " | ||
+ | return true; | ||
+ | } | ||
+ | }), | ||
+ | | ||
+ | } | ||
+ | }; | ||
+ | |||
+ | int main() { | ||
+ | auto observer | ||
+ | Observable observable; | ||
+ | observable.listener.push_back(observer); | ||
+ | observable.call(); | ||
+ | observer = nullptr; | ||
+ | observable.call(); | ||
+ | std::cout << " | ||
+ | } | ||
+ | </ | ||
+ | |||
+ | Résultat: | ||
+ | |||
+ | < | ||
+ | Call | ||
+ | ~Observer | ||
+ | Fails | ||
+ | END | ||
+ | </ |
helloworld/design_pattern/observer.1589147516.txt.gz · Dernière modification : de root