head first 第一章学习

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值