#include #include #include #include using namespace std; // ==== COM Observer Pattern Framework ======================================== #include "observer.h" #include "clntxdef.h" // ==== Application that uses the Classic Observer Pattern ==================== // == ConcreteSubjects == typedef Model Pin; typedef Model Register; // == ConcreteObservers == template class DecDisplay { public: DecDisplay(Model& m, const string& n): cow(m, this, &DecDisplay::update), name(n) { } private: void update() { cout<get()< > cow; string name; }; typedef DecDisplay RegisterDisplay; typedef DecDisplay PinDisplay; // == Components == template class UnaryComponent { typedef Func::argument_type T; public: UnaryComponent(Model& i1, Model& o): in1(i1, this, &UnaryComponent::update), out(o) { update(); } private: void update() { currentValue=func(in1->get()); if (out.get()!=currentValue) out.set(currentValue); } Func func; T currentValue; CallOnWrite > in1; Model& out; }; struct buffer : public unary_function { bool operator() (bool b) const { return b; } }; typedef UnaryComponent Buffer; // == GUID COM Components == DEFINE_GUID(CLSID_EXOR,0xAD6AFA60,0xD7A5,0x11D1,0xAB,0x71,0,0,0x1B,0x1C,0x56,0xEE); // == Simulator == class Simulator { public: Pin pin1, pin2, pin3; void run() { pin1.set(0); pin2.set(0); pin1.set(1); pin2.set(0); pin1.set(1); pin2.set(1); pin1.set(1); pin2.set(0); pin1.set(0); pin2.set(0); } }; // == User Interface == void main() { Simulator s; PinDisplay d1(s.pin3, "Pin 3"); COMComponent exor(CLSID_EXOR); COMModel in1(exor.getNextBitModel()); COMModel in2(exor.getNextBitModel()); COMModel out(exor.getNextBitModel()); Buffer buf1(s.pin1, in1); Buffer buf2(s.pin2, in2); Buffer buf3(out, s.pin3); s.run(); #ifdef __TURBOC__ cout<<"Press a key: "; cin.get(); #endif }