关于策略模式的具体内容大家可以看书,这里只贴我的实现代码。写的仓促,可能存在考虑不全面的地方,欢迎留言。
strategy.h//strategy.h #includestrategy.cppusing 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) {} };
#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;
}
输出结果



