mirror of
https://github.com/boostorg/contract.git
synced 2026-01-28 07:02:16 +00:00
83 lines
1.9 KiB
C++
Executable File
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;
|
|
}
|
|
|