c++策略模式headfirst鸭子
关于策略模式的具体内容大家可以看书,这里只贴我的实现代码。写的仓促,可能存在考虑不全面的地方,欢迎留言。
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) {}
};
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
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();
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
- 59
- 60
- 61
- 62
- 63
- 64
- 65
- 66
- 67
- 68
- 69
- 70
- 71
- 72
- 73
- 74
- 75
- 76
- 77
- 78
- 79
- 80
- 81
- 82
main.cpp
void test1();
int main(){
test1();
return 0;
}
- 1
- 2
- 3
- 4
- 5
输出结果
推荐阅读