head first 第一章主要讲了设计模式的两个重要原则:
1 把类中可变的部分拿出来进行封装,这也符合ocp原则,设计类的重要思想哈
2 对接口编程,而不是对实现编程。 对接口编程实际上就是上一条封装的那部分,
封装的类就是接口类哈。
虽然head first的实现是用java写的,但咱可以给改成c++的哈 ,代码如下
class duck
{
public:
duck();
virtual ~duck();
public:
//这个是不变的
void swimming();
//把fly的行为委托给接口
virtual void ducktofly();
//这个方法可以动态的改变duck对象的行为
void setFlyBeavior(FlyBeavior *pFly);
public:
//行为接口,只写一个fly
FlyBeavior *m_pFly;
};
//会飞的鸭子
class duck11 : public duck
{
public:
duck11();
~duck11();
};
//不会飞的鸭子
class duck22 : public duck
{
public:
duck22();
~duck22();
};
duck::duck()
{
}
duck::~duck()
{
}
void duck::swimming()
{
}
void duck::setFlyBeavior(FlyBeavior *pFly)
{
m_pFly = pFly;
}
//让接口去处理,我不关心具体的实现,即子类的行为
void duck::ducktofly()
{
if (m_pFly != NULL)
{
m_pFly->Fly();
}
}
duck11::duck11()
{
m_pFly = new canFly;
}
duck11::~duck11()
{
if (m_pFly)
{
delete m_pFly;
}
}
duck22::duck22()
{
m_pFly = new noFly;
}
duck22::~duck22()
{
if (m_pFly)
{
delete m_pFly;
}
}
//接口实现
class FlyBeavior
{
public:
virtual void Fly();
};
//飞的行为也有不同,简单的有的会飞,有的不会
class canFly : public FlyBeavior
{
public:
void Fly();
};
class noFly : public FlyBeavior
{
public:
void Fly();
};
void FlyBeavior::Fly()
{
printf("this is bass flybeavior fly/n");
}
void canFly::Fly()
{
printf("i can fly/n");
}
void noFly::Fly()
{
printf("i no fly/n");
}
int _tmain(int argc, _TCHAR* argv[])
{
duck *pduck1= new duck11;
pduck1->ducktofly();
duck *pduck2 = new duck22;
pduck2->ducktofly();
//动态改变鸭子的行为状态
pduck2->setFlyBeavior(new canFly);
pduck2->ducktofly();
getchar();
return 0;
}