1. 使用将fly、quack行为从类中提取出来,作为interface
思路:将fly、quack行为从类中提取出来,作为interface,有相关功能的子类去实现对应的接口。
#include<iostream>
using namespace std;
class Duck
{
private:
string kind;
public:
Duck(string kind)
{
this->kind = kind;
}
~Duck(){}
virtual void display(){}
void swim() {
cout << "游泳"<< endl;
}
virtual void quack(){};
virtual void fly(){};
};
class MallardDuck : public Duck
{
private:
public:
MallardDuck(string kind):Duck(kind){}
~MallardDuck(){}
void display(){
cout<<"种类:MallardDuck"<<endl;
}
void quack(){
cout << "嘎嘎嘎" << endl;
}
};
class ThomdDuck : public Duck
{
private:
public:
ThomdDuck(string kind):Duck(kind){}
~ThomdDuck(){}
void display(){
cout<<"种类:ThomdDuck"<<endl;
}
void quack(){
cout << "嘎嘎嘎" << endl;
}
void fly(){
cout << "飞行" << endl;
}
};
void DuckDisplay(Duck* d){
d->display();
d->fly();
d->quack();
d->swim();
}
int main(){
MallardDuck md("Mallard");
md.display();
md.fly();
md.quack();
md.swim();
ThomdDuck td("Thomd");
DuckDisplay(&td);
cout << endl;
Duck* d = new MallardDuck("Mallard");
d->display();
d->fly();
d->quack();
d->swim();
d = new ThomdDuck("Thomd");
DuckDisplay(d);
if(d!=NULL){
delete d;
}
return 0;
}
输出:
种类:MallardDuck
嘎嘎嘎
游泳
种类:ThomdDuck
飞行
嘎嘎嘎
游泳
种类:MallardDuck
嘎嘎嘎
游泳
种类:ThomdDuck
飞行
嘎嘎嘎
游泳
使用这种方式的利弊书中有具体讲解,这里就不再重复了,再看策略模式的实现。
2.策略模式的实现
#ifndef _V2DUCK_H
#define _V2DUCK_H
#include<iostream>
using namespace std;
class FlyBehavior
{
public:
FlyBehavior(){}
~FlyBehavior(){}
virtual void fly(){};
};
class FlyWithWings:public FlyBehavior
{
private:
public:
FlyWithWings(){}
~FlyWithWings(){}
void fly(){
cout << "用翅膀飞行"<<endl;
}
};
class FlyNoWay:public FlyBehavior
{
private:
public:
FlyNoWay(){}
~FlyNoWay(){}
void fly(){
cout << "cannot fly"<<endl;
}
};
class FlyRocketPowered:public FlyBehavior
{
private:
public:
FlyRocketPowered(){}
~FlyRocketPowered(){}
void fly(){
cout << "借助火箭推力飞行"<<endl;
}
};
class QuackBehavior
{
private:
public:
QuackBehavior(){}
~QuackBehavior(){}
virtual void quack() {};
};
class Quack:public QuackBehavior
{
private:
public:
Quack(){}
~Quack(){}
void quack(){
cout<<"嘎嘎嘎的叫声"<<endl;
}
};
class SQuack:public QuackBehavior
{
private:
public:
SQuack(){}
~SQuack(){}
void quack(){
cout<<"吱吱吱的叫声"<<endl;
}
};
class MuteQuack :public QuackBehavior
{
private:
public:
MuteQuack(){}
~MuteQuack(){}
void quack(){
cout<<"没有叫声"<<endl;
}
};
class Duck
{
private:
public:
string kind;
FlyBehavior* fly_behavior;
QuackBehavior* quack_behavior;
public:
Duck(string kind){
}
~Duck(){}
void performFly(){
this->fly_behavior->fly();
}
void performQuack(){
this->quack_behavior->quack();
}
virtual void display(){
cout<<"这是鸭子基类"<<endl;
}
void swim(){
cout<<"all ducks can swim"<<endl;
}
void setFlyBehavior(FlyBehavior* fb){
this->fly_behavior = fb;
}
void setQuackBehavior(QuackBehavior* qb){
this->quack_behavior = qb;
}
};
#endif
#include "v2duck.hpp"
class MallardDuck:public Duck
{
private:
public:
MallardDuck():Duck("MallardDuck"){
fly_behavior =new FlyWithWings();
quack_behavior =new Quack();
}
~MallardDuck(){}
void display(){
cout<<"品种:MallardDuck"<<endl;
}
};
int main(){
Duck* mallard = new MallardDuck();
mallard->display();
mallard->performFly();
mallard->performQuack();
mallard->setFlyBehavior(new FlyRocketPowered());
mallard->setQuackBehavior(new MuteQuack());
mallard->performFly();
mallard->performQuack();
if(mallard!=NULL){
delete mallard;
}
return 0;
}
输出:
品种:MallardDuck
用翅膀飞行
嘎嘎嘎的叫声
借助火箭推力飞行
没有叫声
3.游戏思考题
其实和2.基本一致。
#ifndef _GAME_H
#define _GAME_H
#include<iostream>
using namespace std;
class WeaponBehavior
{
private:
public:
WeaponBehavior(){}
~WeaponBehavior(){}
virtual void useWeapon(){}
};
class Gun:public WeaponBehavior
{
private:
public:
Gun(){}
~Gun(){}
void useWeapon(){
cout<<"使用武器:枪"<<endl;
}
};
class Knife:public WeaponBehavior
{
private:
public:
Knife(){}
~Knife(){}
void useWeapon(){
cout<<"使用武器:刀"<<endl;
}
};
class GameRole
{
private:
public:
string role_name;
WeaponBehavior* weaponBh;
GameRole(string role_name){
this->role_name = role_name;
}
~GameRole(){}
void useWeapon(){
this->weaponBh->useWeapon();
}
void setWeapon(WeaponBehavior* new_weapon){
this->weaponBh = new_weapon;
cout<<"更换武器"<<endl;
}
virtual void display(){
cout << "这是角色基类,请选择具体角色"<<endl;
}
};
#endif
#include "game.hpp"
class Spirit:public GameRole
{
private:
public:
Spirit():GameRole("小精灵"){
weaponBh = new Gun();
}
~Spirit(){}
void display(){
cout <<"角色:小精灵"<<endl;
}
};
int main(){
GameRole* spirit = new Spirit();
spirit->display();
spirit->useWeapon();
spirit->setWeapon(new Knife());
spirit->useWeapon();
return 0;
}
输出:
角色:小精灵
使用武器:枪
更换武器
使用武器:刀