|
namespace designpattern_composite { class component { public: virtual void operation() = 0 ; virtual void add(component*) {} } ;
class abstractcomponent1 : virtual public component {} ;
class abstractleaf1 : virtual public abstractcomponent1 {} ;
class composite1 : public abstractcomponent1 { public: virtual void operation() { /* do operation */ } virtual void add(component*) ; } ; void composite1::add(component *p) { abstractcomponent1 *pc1 = dynamic_cast<abstractcomponent1*>(p) ; if (pc1 == null) return ; // do add operation }
class abstractcomponent2 : virtual public component {} ;
class abstractleaf2 : virtual public abstractcomponent2 {} ;
class composite2 : public abstractcomponent2 { public: virtual void operation() { /* do operation */ } virtual void add(component*) ; } ; void composite2::add(component *p) { abstractcomponent2 *pc2 = dynamic_cast<abstractcomponent2*>(p) ; if (pc2 == null) return ; // do add operation }
class concreteleaf1 : public abstractleaf1 { public: virtual void operation() { /* do operation */ } } ;
class concreteleaf2 : public abstractleaf1, public abstractleaf2 { public: virtual void operation() { /* do operation */ } } ; }
客户端代码: { using namespace designpattern_composite ;
component *pc1 = new concreteleaf1() ; component *pc2 = new concreteleaf2() ; component *pc3 = new composite1() ; component *pc4 = new composite2() ; pc3->add(pc1) ; // ok pc3->add(pc2) ; // ok pc3->add(pc3) ; // ok pc3->add(pc4) ; // fail pc4->add(pc1) ; // fail pc4->add(pc2) ; // ok pc4->add(pc3) ; // fail pc4->add(pc4) ; // ok } |