#include<iostream>usingnamespacestd;classAbstractClass{public:virtualvoidOperation1()=0;virtualvoidOperation2()=0;};classConcreteClassA:publicAbstractClass{public:voidOperation1(){cout<<"Do Operation 1 of A"<<endl;}voidOperation2(){cout<<"Do Operation 2 of A"<<endl;}};classConcreteClassB:publicAbstractClass{public:voidOperation1(){cout<<"Do Operation 1 of B"<<endl;}voidOperation2(){cout<<"Do Operation 2 of B"<<endl;}};intmain(){AbstractClass*abstract;abstract=newConcreteClassB();abstract->Operation1();abstract->Operation2();return0;}
#include<iostream>classFlyBehavior{public:virtual~FlyBehavior(){};virtualvoidfly()=0;};classQuackBehavior{public:virtual~QuackBehavior(){};virtualvoidquack()=0;};classDuck{public:Duck(FlyBehavior*p_FlyBehavior,QuackBehavior*p_QuackBehavior){pFlyBehavior=p_FlyBehavior;pQuackBehavior=p_QuackBehavior;}virtual~Duck(){};virtualvoiddisplay(){};voidperformFly(){pFlyBehavior->fly();}voidperformQuack(){pQuackBehavior->quack();}private:FlyBehavior*pFlyBehavior;QuackBehavior*pQuackBehavior;};classFlyWithWings:publicFlyBehavior{public:voidfly(){std::cout<<"I'm flying!!"<<std::endl;}};classFlyNoWay:publicFlyBehavior{public:voidfly(){std::cout<<"I can't fly"<<std::endl;}};classQuack:publicQuackBehavior{public:voidquack(){std::cout<<"Quack"<<std::endl;}};classMuteQuack:publicQuackBehavior{public:voidquack(){std::cout<<"<< Slience >>"<<std::endl;}};classSqueak:publicQuackBehavior{public:voidquack(){std::cout<<"Squeak"<<std::endl;}};classMallardDuck:publicDuck{// 继承了对象基类,就已经有了方法基类指针public:MallardDuck(FlyBehavior*fly_behavior=newFlyWithWings(),// 构造函数含有缺省值QuackBehavior*quack_behavior=newQuack()):Duck(fly_behavior,quack_behavior){}// 绿头鸭的构造函数,飞行和叫声的基类指针分别指向了对应的实现类voiddisplay(){std::cout<<"I'm a real Mallard duck"<<std::endl;}};classRubberDuck:publicDuck{public:RubberDuck(FlyBehavior*fly_behavior=newFlyNoWay(),QuackBehavior*quack_behavior=newSqueak()):Duck(fly_behavior,quack_behavior){}voiddisplay(){std::cout<<"I'm a Rubber duck"<<std::endl;}};classDecoyDuck:publicDuck{public:DecoyDuck(FlyBehavior*fly_behavior=newFlyNoWay(),QuackBehavior*quack_behavior=newMuteQuack()):Duck(fly_behavior,quack_behavior){}voiddisplay(){std::cout<<"I'm just a Decoy duck"<<std::endl;}};intmain(){Duck*mallard=newMallardDuck();mallard->display();mallard->performFly();mallard->performQuack();Duck*rubber=newRubberDuck();rubber->display();rubber->performQuack();return0;}/*output:I'm a real Mallard duckI'm flying!!QuackI'm a Rubber duckSqueak*/