C++:设计模式之策略模式(例子)

// 设计模式测试.cpp : 定义控制台应用程序的入口点。
// 策略模式

#include "stdafx.h"
#include <string>
#include <iostream>
using namespace std;
/*************************策略模式之人物示例*********************************/
//武器接口
class IWeaponBehavior
{
public:
	virtual string useWeapon() = 0;	
};
class SwordBehavior :public IWeaponBehavior
{
public:
	string useWeapon() {
		return "Sword!";
	}
};
class KnigfeBehavior :public IWeaponBehavior
{
public:
	string useWeapon() {
		return "Knigfe!";
	}
};
//人物基类
class Character{
protected:
	IWeaponBehavior *weapon;
public:
	void fight() {
		cout<< "Fight with " << weapon->useWeapon() << endl;
	}
	void setWeapon(IWeaponBehavior *w) {
		cout << "Changing Weapon!" << endl;
		this->weapon = w;
	}
};
class King:public Character
{
public:
	King() {
		weapon = new SwordBehavior();
	}
};
//主函数
//int main()
//{
//	Character *king = new King();
//	king->fight();
//	king->setWeapon(new KnigfeBehavior);
//	king->fight();
//	system("Pause");
//    return 0;
//}
/*************************策略模式之鸭子示例*********************************/
//飞行方式接口
class IFlyBehavior
{
public:
	virtual void fly() = 0;
private:
};
class FlyWithWings : public IFlyBehavior
{
public:
	void fly() {
		cout << "I can flying! " << endl;
	}
};
class FlyNoWay : public IFlyBehavior
{
public:
	void fly() {
		cout << "I can't Fly ! " << endl;
	}

};
class Rocket : public IFlyBehavior {
public:
	void fly() {
		cout << "I am flying with Rocket! " << endl;
	}
};
//叫声方式接口
class IQuackBehavior
{
public:
	virtual void quack() = 0;
private:
};
class Quack : public IQuackBehavior
{
public:
	void quack() {
		cout << "Quack! " << endl;
	}

};
class MuteQuack : public IQuackBehavior
{
public:
	void quack() {
		cout << "Silence ! " << endl;
	}

};
class Squeak : public IQuackBehavior
{
public:
	void quack() {
		cout << "Squeak ! " << endl;
	}

};
//鸭子基类
class Duck {
protected:
	IFlyBehavior *flyBehavior;
	IQuackBehavior *qcackBehavior;
public:
	virtual void display() {};
	void performFly() {
		flyBehavior->fly();
	}
	void performQuack() {
		qcackBehavior->quack();
	}
	void setFlyBehavior(IFlyBehavior *fb) {
		cout << "Changing FlyBehavior" << endl;
		flyBehavior = fb;
	}
	void setQuackBehavior(IQuackBehavior *qb) {
		cout << "Changing QuackBehavior" << endl;
		qcackBehavior = qb;
	}
};
class Mallard : public Duck {
public:
	Mallard() {
		qcackBehavior = new Quack();
		flyBehavior = new FlyWithWings();
	}
	void display() {
		cout << "I am Mallard! " << endl;
	}
};
class ModelDuck : public Duck {
public:
	ModelDuck() {
		qcackBehavior = new MuteQuack();
		flyBehavior = new FlyNoWay();
	}
	void display() {
		cout << "I am ModelDuck! " << endl;
	}
};
//主函数
int main()
{
	Duck *modelDuck = new ModelDuck();
	Duck *mallard = new Mallard();
	modelDuck->display();
	modelDuck->performFly();
	modelDuck->performQuack();

	modelDuck->setFlyBehavior(new Rocket());
	modelDuck->setQuackBehavior(new Squeak());
	modelDuck->performFly();
	modelDuck->performQuack();

	cout << endl;
	mallard->display();
	mallard->performFly();
	mallard->performQuack();

	system("Pause");
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值