head first 第一章学习

来源:互联网 发布:数据采集卡企业 编辑:程序博客网 时间:2024/05/19 22:01

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;
}

原创粉丝点击