// ★ demo 1 #include <iostream> #include <vector> #include <ctime> using namespace std; class Base { Base* next; // 1. 基类中要有"next"指针 public: Base() { next = 0; } void setNext( Base* n ) { next = n; } void add( Base* n ) { if (next) next->add( n ); else next = n; } // 2. 把消息处理的工作代理给链中的下一个对象 virtual void handle( int i ) { next->handle( i ); } }; class Handler1 : public Base { public: virtual void handle( int i ) { if (rand() % 3) // 3. 如果消息自己处理不了,交给基类,由基类负责 { cout << "H1 passsed " << i << " "; Base::handle( i ); } else cout << "H1 handled " << i << " "; } }; class Handler2 : public Base { public: virtual void handle( int i ) { if (rand() % 3) { cout << "H2 passsed " << i << " "; Base::handle( i ); } else cout << "H2 handled " << i << " "; } }; class Handler3 : public Base { public: virtual void handle( int i ) { if (rand() % 3) { cout << "H3 passsed " << i << " "; Base::handle( i ); } else cout << "H3 handled " << i << " "; } }; void main( void ) { srand( time( 0 ) ); Handler1 root; Handler2 two; Handler3 thr; root.add( &two ); root.add( &thr ); thr.setNext( &root ); for (int i=1; i < 10; i++) { root.handle( i ); cout << '/n'; } } // ★ demo 2 #include <iostream> #include <vector> #include <ctime> using namespace std; class Component { int value; Component* next; // 1. 基类中要有"next"指针 public: Component( int v, Component* n ) { value = v; next = n; } void setNext( Component* n ) { next = n; } virtual void traverse() { cout << value << ' '; } // 2. 把消息处理的工作代理给链中的下一个对象 virtual void volunteer() { next->volunteer(); } }; class Primitive : public Component { public: Primitive( int val, Component* n = 0 ) : Component( val, n ) { } virtual void volunteer() { Component::traverse(); // 自己先处理一部分 if (rand() * 100 % 6 != 0) // 负责不了的部分,代理给基类 Component::volunteer(); } }; class Composite : public Component { vector<Component*> children; public: Composite( int val, Component* n = 0 ) : Component( val, n ) { } void add( Component* c ) { children.push_back( c ); } virtual void traverse() // Composite只负责traverse的处理 { Component::traverse(); for (int i=0; i < children.size(); i++) children[i]->traverse(); } // 3. Composite不负责处理volunteer事件,总是把这部分工作代理给基类 virtual void volunteer() { Component::volunteer(); } }; void main( void ) { srand( time( 0 ) ); // 1 Primitive seven( 7 ); // | Primitive six( 6, &seven ); // +-- 2 Composite three( 3, &six ); // | | three.add( &six ); three.add( &seven ); // | +-- 4 5 Primitive five( 5, &three ); // | Primitive four( 4, &five ); // +-- 3 Composite two( 2, &four ); // | | two.add( &four ); two.add( &five ); // | +-- 6 7 Composite one( 1, &two ); // | Primitive nine( 9, &one ); // +-- 8 9 Primitive eight( 8, &nine ); one.add( &two ); one.add( &three ); one.add( &eight ); one.add( &nine ); seven.setNext( &eight ); cout << "traverse: "; one.traverse(); cout << '/n'; for (int i=0; i < 8; i++) { one.volunteer(); cout << '/n'; } } // ★ demo 3 #include <iostream> #include <ctime> using namespace std; class Link { int id; Link* next; // 1. "next"指针 static int theBid; // 2. 中标的人 static Link* bidder; // 2. 和他的标价 public: Link( int num ) { id = num; next = 0; } void addLast( Link* l ) { if (next) // 2. Handle and/or pass on next->addLast( l ); else next = l; } void bid() { int num = rand() % 9; // 3. 标价 cout << id << '-' << num << " "; if (num < theBid) // 4. 如果出的标价比以前的低 { // 4. 则此人暂时中标 theBid = num; bidder = this; } if (next) // 5. 再看下一个人的标价的高低 next->bid(); else bidder->execute(); // 6. 最后中标的人,获得执行的权利 } void execute() { cout << id << " is executing/n"; theBid = 999; } }; int Link::theBid = 999; // 7. 给个最大值 Link* Link::bidder = 0; void main( void ) { Link chain( 1 ); for (int i=2; i < 7; i++) chain.addLast( new Link( i ) ); srand( time( 0 ) ); for (i=0; i < 10; i++) chain.bid(); // 3. Client "launches & leaves" }