最近在看《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