您的位置:首页 > 其它

Strategy Pattern 策略模式(一)

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

不过因为这本书程序语言用的Java的,所以我想慢慢试试,把它转移到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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: