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
