¿El patrón de diseño del observador ya está definido en STL (como java.util.Observer y java.util.Observable en Java)?Patrón de diseño del observador en C++
Respuesta
Aquí hay una implementación de referencia (desde Wikipedia).
#include <iostream>
#include <string>
#include <map>
#include <boost/foreach.hpp>
class SupervisedString;
class IObserver{
public:
virtual void handleEvent(const SupervisedString&) = 0;
};
class SupervisedString{ // Observable class
std::string _str;
std::map<IObserver* const, IObserver* const> _observers;
typedef std::map<IObserver* const, IObserver* const>::value_type item;
void _Notify(){
BOOST_FOREACH(item iter, _observers){
iter.second->handleEvent(*this);
}
}
public:
void add(IObserver& ref){
_observers.insert(item(&ref, &ref));
}
void remove(IObserver& ref){
_observers.erase(&ref);
}
const std::string& get() const{
return _str;
}
void reset(std::string str){
_str = str;
_Notify();
}
};
class Reflector: public IObserver{ // Prints the observed string into std::cout
public:
virtual void handleEvent(const SupervisedString& ref){
std::cout<<ref.get()<<std::endl;
}
};
class Counter: public IObserver{ // Prints the length of observed string into std::cout
virtual void handleEvent(const SupervisedString& ref){
std::cout<<"length = "<<ref.get().length()<<std::endl;
}
};
int main(){
SupervisedString str;
Reflector refl;
Counter cnt;
str.add(refl);
str.reset("Hello, World!");
std::cout<<std::endl;
str.remove(refl);
str.add (cnt);
str.reset("World, Hello!");
std::cout<<std::endl;
return 0;
}
Difícil de tomar en serio una implementación en C++ que use nombres de funciones de miembros ilegales como _Notify. –
Aún así es válido C++. –
Aparentemente tiene otros problemas también. Consulte la página de discusión: http://en.wikipedia.org/wiki/Talk:Observer_pattern#Implementation_flaw_in_C.2B.2B – Manuel
No, no lo hace. El C++ STL es mucho más pequeño que la biblioteca estándar de Java. Si está buscando algo para expandir en el STL que es compatible con casi todo, valdría la pena echar un vistazo a las bibliotecas de Boost. En este caso, puede consultar Boost.Signals que proporciona un modelo de señal/ranura.
No, pero Boost.Signals2 le ofrece algo similar.
El Observer design pattern no está definido en la STL
. Puede consultar el "Gang of four" Design Patterns book o una búsqueda en Google debe proporcionar suficientes detalles para implementarlo. Si esta pregunta no se responde pronto, publicaré un ejemplo rápido.
O puede copiar y pegar la implementación de Wikipedia que alguien ha vinculado en otra respuesta – Manuel
gracias! Las señales de Boost se ven interesantes.He usado Boost para la generación de números aleatorios, pero nunca para un patrón de observador o señales como lo llaman. De todos modos, creo que la evaluación del patrón de observadores GOF y Boost Signals es una buena idea, al menos para fines académicos. –
Según mi conocimiento va en C++, STL no tiene una implementación para el patrón Observer. Sin embargo, hubo una propuesta para Signal/Slot para la biblioteca estándar en TR2.
Hay muchas bibliotecas que proporcionan implementación para el patrón Observer. La biblioteca Qt es una de las pioneras. La biblioteca de impulso tiene una implementación (vea Boost :: Signals & Boost :: Signals2).
La biblioteca Poco C++ tiene una implementación clara del patrón de observador (vea el NotificationCenter).
libsigC++, cpp-events son algunas de las otras bibliotecas que proporcionan implementaciones de señal/ranura.
#include <iostream>
#include <string>
#include <set>
using namespace std;
class Subject;
class Observer {
public:
virtual void update(Subject & subject) = 0;
};
// also knows as Observable in literature
class Subject
{
string state;
set<Observer*> observers;
public:
void attachObserver(Observer *o) { observers.insert(o); }
void detachObserver(Observer *o) { observers.erase(o); }
void notifyObservers()
{
for (auto &o : observers)
{
o->update(*this);
}
}
string getState() { return state; }
void changeState(const string & s)
{
state = s;
notifyObservers();
}
};
class ObserverImpl : public Observer
{
string state;
public:
void update(Subject & sbj) override
{
state = sbj.getState();
}
string getState() { return state; }
};
int main()
{
ObserverImpl a, b, c;
Subject subject;
subject.attachObserver(&a);
subject.attachObserver(&b);
subject.attachObserver(&c);
subject.changeState("Observer pattern");
cout << a.getState() << endl;
cout << b.getState() << endl;
cout << c.getState() << endl;
return 0;
}
favor también ver los diagramas de flujo/UML http://www.patterns.pl/observer.html
- 1. C++ propio patrón Observador
- 2. Patrón de diseño del observador: sujetos de hormigón y observadores
- 3. Patrón de diseño del observador frente a "Oyentes"
- 4. Patrón de observador multiproceso
- 5. Patrón de observador para el cronómetro
- 6. ¿Patrón de observador implementado en C# con delegados?
- 7. Patrón de observador: cuando a
- 8. Patrón de observador en lenguaje Go
- 9. Diseño de patrón "Fachada"
- 10. ¿Patrón de observador o devolución de llamada?
- 11. Frustraciones del patrón de diseño
- 12. fábrica (patrón de diseño) en Objective C
- 13. ¿Hay algún "patrón de diseño" en C?
- 14. desventajas del patrón de diseño del generador
- 15. ¿Por qué el patrón del observador debe ser desaprobado?
- 16. patrón Observador de Java no notificar
- 17. ¿Qué es lo opuesto al patrón del observador?
- 18. En C#, ¿no está ya implementado el patrón de observador usando Eventos?
- 19. Eventos y delegados. ¿Qué patrón de diseño?
- 20. plataforma de patrón de diseño C++ api
- 21. Unidad de trabajo de diseño del patrón
- 22. Patrón de diseño de interfaz no virtual en C#/C++
- 23. Señales y ranuras, patrón de diseño en Qt?
- 24. C# productor/consumidor/observador?
- 25. cómo implementar el patrón de observador en javascript?
- 26. F # patrón de diseño
- 27. Diseño Patrón: Constructor
- 28. Patrón de diseño DAO
- 29. Comprensión del patrón de diseño MVC en Cocoa Touch
- 30. Patrón de diseño para llamadas asincrónicas en C#
presumiblemente como un ejemplo de la biblioteca estándar de otro idioma que tiene el patrón de observador construido en él. –
sí Jeremy, eso es correcto – Lucas
¿Es aceptable para usted? Si no, estaría dispuesto a publicar una implementación estándar sin impulso. –