Files
contract/example/DBC_by_Example/Observer/main.cpp
2017-08-28 20:54:11 -07:00

83 lines
1.9 KiB
C++
Executable File

/**
* @file
* @author Copyright (C) 2009 Lorenzo Caminiti.
* Distributed under DBC++ Software License (see file LICENSE_1_0.txt).
*/
/* $Id$ */
#include "Subject.hpp"
#include <dbc.hpp>
#include <iostream>
/** Implementation of abstract subject. */
class ConcreteSubject: public Subject {
public:
/** State being observed. */
typedef int State;
ConcreteSubject(): state_() {}
/** Set state being observed. */
void setState(const State& state) {
std::cout << "Changing state to " << state << std::endl;
state_ = state;
notify();
}
/** Get state being observed. */
State getState() const { return state_; }
private:
State state_;
};
/** Implementation of abstract observer. */
class ConcreteObserver: public Observer {
public:
/** Creates concrete observer. */
ConcreteObserver(const ConcreteSubject& subject): subject_(subject),
observedState_() {}
private:
bool upToDateWithSubject() const
DBC_MEM_FUN( (private) (bool) (ConcreteObserver)DBC_BASE(Observer)
(upToDateWithSubject)() (const), {
}, {
}, {
return true;
})
void update()
DBC_MEM_FUN( (private) (void) (ConcreteObserver)DBC_BASE(Observer)
(update)(), {
}, {
}, {
observedState_ = subject_.getState();
std::cout << "Observed state " << observedState_ << std::endl;
})
const ConcreteSubject& subject_;
ConcreteSubject::State observedState_;
};
int main() {
ConcreteSubject s;
ConcreteObserver o(s);
std::cout << std::endl << "Attaching observer " << &o << "..."
<< std::endl;
s.attach(&o);
ConcreteSubject::State st = -10;
std::cout << std::endl << "Setting state to " << st << "..." << std::endl;
s.setState(st);
st = +10;
std::cout << std::endl << "Re-setting state to " << st << "..."
<< std::endl;
s.setState(st);
return 0;
}