source: src/CodePatterns/Observer/Relay.hpp@ e24dde

Last change on this file since e24dde was 454bc54, checked in by Frederik Heber <heber@…>, 10 years ago

Added new pattern ObservedValue, contrary to Cacheable.

  • essentially updates immediately and caches a value for off-line use, safe- guard with mutexes.
  • added unit test for ObservedValue.
  • factored threeNumbers stub out of CacheableUnitTest, also used the stub in ObservedValueUnitTest.
  • we may now signOn() to Notification with a priority.
  • Cacheable can also update now via notification channels not just for global updates.
  • Observable can now also instantiate the channels directly if given a list. This was necessary as Cacheable or ObservedValue are instantiated in the constructor, too, and if listening to channels, these must already be present.
  • FIX: Channels::addChannels() used NDEBUG wrong way round.
  • ObservedValue::get() returns reference.
  • Property mode set to 100644
File size: 1.8 KB
Line 
1/*
2 * Relay.hpp
3 *
4 * Created on: Dec 1, 2011
5 * Author: heber
6 */
7
8#ifndef RELAY_HPP_
9#define RELAY_HPP_
10
11// include config.h
12#ifdef HAVE_CONFIG_H
13#include <config.h>
14#endif
15
16#include "CodePatterns/Observer/Observable.hpp"
17
18/**
19 * A Relay acts as a node in a many-to-one observation.
20 *
21 * All Observable::update() calls will pass through this relay. Hence, if an
22 * instance desires to observe all atoms and be notified of each single change,
23 * he would otherwise be forced to not only Observable:signon() to each and
24 * every one of them but also to keep track of all newly created ones.
25 *
26 * Instead he simply uses Relay::signOn() of the specific Relay he wishes
27 * to use (note Relay should are singleton of nature but are not required to
28 * inherit the Singleton pattern) and will get notified as if he were
29 * signOn()'ed to each atom because Observer::update() will get passed through
30 * the Relay. I.e. the given reference to the Observer points to the atom that
31 * initiated the update() call and not to the Relay.
32 */
33class Relay : public Observable {
34public:
35 Relay(std::string _name);
36 virtual ~Relay();
37
38 virtual void signOn(Observer *target, PriorityLevel priority = Observable::PriorityDefault) const;
39
40 virtual void signOff(Observer *target) const;
41
42 virtual void signOn(Observer *target, size_t channelno, PriorityLevel priority = Observable::PriorityDefault) const;
43
44 virtual void signOff(Observer *target, size_t channelno) const;
45
46protected:
47 virtual void update(Observable *publisher);
48 virtual void recieveNotification(Observable *publisher, Notification_ptr notification);
49 virtual void subjectKilled(Observable *publisher);
50
51 virtual void notifyAll();
52
53private:
54 //!> Current peer that called last update on us, to be passed on to Observers
55 Observable *Updater;
56};
57
58
59#endif /* RELAY_HPP_ */
Note: See TracBrowser for help on using the repository browser.