Head First 设计模式:Strategy Pattern 策略模式(一)

    最近在看《Head First 设计模式》这本书,挺好的一本书,比较好理解,因为以前没接触设计模式,挑了这本入门。

不过因为这本书程序语言用的Java的,所以我想慢慢试试,把它转移到C++中来。Java里不支持多重继承,interface里只有函数声明,并不包含实现。C++里用抽象类来模拟Java的Interface。这应该是首先要牢记心中的两个重要地方,extend 就是继承(是IS-A的关系),implements就是实现接口(是HAS-A的关系)。书中也有重点强调。

以下是我的代码

#include<iostream>
using std::cout;
using std::endl;

//***********************************************
// Fly and Quack Interface.
//***********************************************
class FlyBehavior
{
public :
	virtual void fly() = 0;
};

class QuackBehavior
{
public:
	virtual void quack() = 0;
};
//***********************************************
// Main Class.
//***********************************************
class Duck
{
	//IDemo *pObject = new Child;
protected:
	FlyBehavior *flybehavior;

	QuackBehavior *quackbehavior;

public:
	Duck(){};

	void swim()
	{
		cout<<"All float."<<endl;
	}

	virtual void display(){};

	void performQuack()
	{
		quackbehavior->quack();
	}

	void performFly()
	{
		flybehavior->fly();
	}

	void setQuackBehavior(QuackBehavior* qb)
	{
		quackbehavior = qb;
	}

	void setFlyBehavior(FlyBehavior* fb)
	{
		flybehavior = fb;
	}

};

//***********************************************
// Implement to all FlyBehavior Interface.
//***********************************************

 class  FlyWithWings : public FlyBehavior
 {
 public:
	 void fly()
	 {
		 cout<<"Flying"<<endl;
	 }
 };

 class FlyNoway: public FlyBehavior
 {
 public:
	 void fly()
	 {
		 cout<< "Can't fly"<<endl;
	 }
 };
//***********************************************
// Implement to all QuackBehavior Interface.
//***********************************************
 class Squeak :public QuackBehavior
 {
 public:
	 void quack()
	 {
		 cout<<"Gaga"<<endl;
	 }
 };

 class Mute: public QuackBehavior
 {
 public:
	 void quack()
	 {
		 cout<<"Silence"<<endl;
	 }
 };

 //***********************************************
 // 
 // Inherit from Duck.
 //***********************************************
 class GreenDuck: public Duck
 {
 public:
	 GreenDuck()
	 {
		 //IDemo *pObject = new Child;
		 quackbehavior = new Squeak;
		 flybehavior = new FlyWithWings;

	 }

	 void display()
	 {
		 cout<<"I'm GreenDuck."<<endl;
	 }
 };


 int main()
 {
	 Duck* greenduck = new GreenDuck;
	 greenduck->display();
	 greenduck->performQuack();
	 greenduck->setFlyBehavior(new FlyNoway);
	 greenduck->performFly();

	 delete greenduck;

	 getchar();

	 return 0;
 }

类图:

总结:

策略模式封装变化,通过组合来达到多变的目的。例如这里绿鸭子这个类,你可以让他嘎嘎叫也可以让他不叫,或者直接动态的调整。main里绿鸭子本来是flywithwings,通过动态调整,我们让他flynoway。

关于c++用抽象类来模拟Java的Interface的参考

            http://www.cnblogs.com/xieduo/articles/790583.html

           http://www.drdobbs.com/cpp/c-interfaces/184410630 more patient

           http://stackoverflow.com/questions/318064/how-do-you-declare-an-interface-in-c

        

 

           

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

yaked19

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值