class gadget {public: virtual void request(window* w)=0; virtual void draw()=0; };
gadget
class window {gadget* g; public: window(gadget* p) : g(p) { g->request(this); } void allocate(int x1, int y1, int x2, int y2) { ... } void damage() { g->draw(); } };
window
class button : public gadget {public: button( int x, int y ) : _x(x), _y(y) {} void request(window* w) { _w = w; w->allocate(_x , _y, _x + 20, _y + 15); } void draw() { w->rectangle(_x , _y, _x + 20, _y + 15); } private: int _x; int _y; window* _w; };
item
gadget* b = new button(100,200); window* w = new window(b); w->damage();
class event {int _info; public: event(int i) : _info(i) { } int info() { return _info; } };
event
class handler {event* e; public: handler(event* p) : e(p) { g = 0; } virtual ~handler() { delete e; } int info() { return e->info(); } void set(gadget* p ) { g = p; } virtual void operator()() { if (g) g->callback(); } protected: gadget* g; };
handler
class gadget {public: enum { PRESS, RELEASE }; gadget(int i) : info(i) { next = 0; } void pick(handler* h) { if (h->info() == info) { h->set( this ); } else if (next) next->pick(h); } virtual void callback() = 0; void insert(gadget* g); private: int info; gadget* next; }; void gadget::insert(gadget* g) { if (!next) next = g; else next->insert(g); }
gadget
class button : public gadget {public: button() : gadget(PRESS) { } void callback() { cout << "..."; } };
button
class window {public: window(gadget* p) { g = p; } void insert(gadget* p) { g->insert(p); } void receive(event* e) { handler* h = new handler(e); g->pick(h); (*h)(); } private: gadget* g; };
window
template< class T > class model {public: void tell(view
model * v) { dependent = v; } one view only
void changed() { if (dependent) dependent->update(); } virtual T value()=0; protected: view* dependent; model() { dependent = 0; } restricted creation
};
template< class T > class view {public: view(model< T >* p) { p->tell(this); m = p; } virtual void update() { cout << m->value() << endl;
view or whatever
} protected: model< T >* m; };
class account : public model< int > {int n; public: account() { n = 0; } void operator++() { n++; changed(); } int value() { return n; } };
account
account a; view< int > v(&a); a++; a++;