关于策略模式的具体内容大家可以看书,这里只贴我的实现代码。写的仓促,可能存在考虑不全面的地方,欢迎留言。
strategy.h
//strategy.h
#include<iostream>
using namespace std;
class FlyBehaviour {
public:
virtual void fly() = 0;
};
class Fly :public FlyBehaviour {
public:
void fly() override;
};
class NFly :public FlyBehaviour {
public:
void fly() override;
};
class QuackBehaviour {
public:
virtual void quack() = 0;
};
class Quack :public QuackBehaviour {
public:
void quack() override;
};
class NQuack :public QuackBehaviour {
public:
void quack() override;
};
class Duck {
private:
FlyBehaviour* _flybehaviour;
QuackBehaviour* _quackbehaviour;
public:
void swim();
void performfly();
void performquack();
void setflybehaviour(unsigned short);
void setquackbehaviour(unsigned short);
virtual void display()=0;
};
class MyDuck :public Duck {
private:
string _name;
public:
void display() override;
MyDuck(string name) :_name(name) {}
};
strategy.cpp
#include"stratage.h"
void Fly::fly() {
cout << "can fly";
}
void NFly::fly() {
cout << "can't fly";
}
void Quack::quack() {
cout << "guagua";
}
void NQuack::quack() {
cout << "gaga" ;
}
void Duck::swim(){
cout << "can swim" ;
}
void Duck::performfly(){
_flybehaviour->fly();
}
void Duck::performquack() {
_quackbehaviour->quack();
}
void Duck::setflybehaviour(unsigned short ui = 0) {
if (_flybehaviour) free(_flybehaviour);
switch(ui) {
case(1):
_flybehaviour = new Fly();
break;
case(2):
_flybehaviour = new NFly();
break;
default:
_flybehaviour = new Fly();
break;
}
}
void Duck::setquackbehaviour(unsigned short ui = 0) {
if (_quackbehaviour) free(_quackbehaviour);
switch (ui) {
case(1):
_quackbehaviour = new Quack();
break;
case(2):
_quackbehaviour = new NQuack();
break;
default:
_quackbehaviour = new Quack();
break;
}
}
void MyDuck::display() {
cout << _name<<' ';
swim();
cout << ", ";
performfly();
cout << ", backed with '";
performquack();
cout << "'." << endl;
}
void test1() {
MyDuck myduck1("duck1");
myduck1.setflybehaviour(1);
myduck1.setquackbehaviour(1);
myduck1.display();
MyDuck myduck2("duck2");
myduck2.setflybehaviour(1);
myduck2.setquackbehaviour(2);
myduck2.display();
MyDuck myduck3("duck3");
myduck3.setflybehaviour(2);
myduck3.setquackbehaviour(1);
myduck3.display();
MyDuck myduck4("duck4");
myduck4.setflybehaviour(2);
myduck4.setquackbehaviour(2);
myduck4.display();
}
main.cpp
void test1();
int main(){
test1();
return 0;
}