main.cpp
#include <iostream>
#include "Duck.h"
class Duck;
class FlyBehavior;
class QuackBehavior;
class MiniDuckSimulator : public Duck{
public:
MiniDuckSimulator() {
std::cout << "ctor MiniDuckSimulator" << std::endl;
_fly_behavior = new FlyWithWings();
_quack_behavior = new Squeak();
}
~MiniDuckSimulator() {
std::cout << "dtor MiniDuckSimulator" << std::endl;
}
};
int main( ){
Duck* mallard = new MiniDuckSimulator();
mallard->Swim();
mallard->Display();
mallard->PerformFly();
mallard->PerformQuack();
std::cout << "改变鸭子飞行、叫声 技能" << std::endl;
mallard->SetFlyBehavior( new FlyNoWay() );
mallard->SetQuackBehavior( new MuteQuack() );
mallard->PerformFly();
mallard->PerformQuack();
return 0;
}
Duck.h
#pragma once
#include <iostream>
#include "FlyBehavior.h"
#include "QuackBehavior.h"
class Duck{
public:
Duck(){
std::cout << "ctor Duck" << std::endl;
}
~Duck(){
std::cout << "dtor Duck" << std::endl;
delete _fly_behavior;
delete _quack_behavior;
}
public:
void Swim( ){
std::cout << "Ducks can swim!" << std::endl;
}
void Display( ){
std::cout << "Duck's Display" << std::endl;
}
void PerformFly( ){
_fly_behavior->Fly();
}
void PerformQuack( ){
_quack_behavior->quack();
}
void SetFlyBehavior( FlyBehavior *fb ){
_fly_behavior = fb;
}
void SetQuackBehavior( QuackBehavior *qb ){
_quack_behavior = qb;
}
protected:
FlyBehavior* _fly_behavior;
QuackBehavior* _quack_behavior;
};
FlyBehavior.h
#pragma once
#include <iostream>
class FlyBehavior{
public:
FlyBehavior(){
std::cout << "ctor FlyBehavior" << std::endl;
}
~FlyBehavior(){
std::cout << "dtor FlyBehavior" << std::endl;
}
public:
virtual void Fly( ) = 0;
};
class FlyWithWings : public FlyBehavior{
public:
FlyWithWings(){
std::cout << "ctor FlyWithWings" << std::endl;
}
~FlyWithWings(){
std::cout << "dtor FlyWithWings" << std::endl;
}
public:
void Fly( ){
std::cout << "I'm flying!" << std::endl;
}
};
class FlyNoWay : public FlyBehavior{
void Fly( ){
std::cout << "I can't fly" << std::endl;
}
};
QuackBehavior.h
#pragma once
#include <iostream>
class QuackBehavior{
public:
QuackBehavior() = default;
~QuackBehavior() = default;
public:
virtual void quack( ) = 0;
};
class Quack : public QuackBehavior{
public:
Quack(){
std::cout << "ctor Quack" << std::endl;
}
~Quack(){
std::cout << "dtor Quack" << std::endl;
}
public:
void quack( ){
std::cout << "Quack" << std::endl;
}
};
class MuteQuack : public QuackBehavior{
public:
MuteQuack(){
std::cout << "ctor MuteQuack" << std::endl;
}
~MuteQuack(){
std::cout << "dtor MuteQuack" << std::endl;
}
public:
void quack( ){
std::cout << " <<Slience>> " << std::endl;
}
};
class Squeak : public QuackBehavior{
public:
Squeak(){
std::cout << "ctor Squeak" << std::endl;
}
~Squeak(){
std::cout << "dtor Squeak" << std::endl;
}
public:
void quack( ){
std::cout << "Squeak" << std::endl;
}
};