Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1814594
  • 博文数量: 438
  • 博客积分: 9799
  • 博客等级: 中将
  • 技术积分: 6092
  • 用 户 组: 普通用户
  • 注册时间: 2012-03-25 17:25
文章分类

全部博文(438)

文章存档

2019年(1)

2013年(8)

2012年(429)

分类: C/C++

2012-03-25 18:39:15

假如你有一个类层次


  1. class Vehicle
  2. {
  3. public:
  4.     virtual void Move() = 0;
  5. };

  6. class Car : public Vehicle
  7. {
  8. public:
  9.     virtual void Move() { // Car's Move }
  10. };

  11. class Boat : public Vehicle
  12. {
  13. public:
  14.     virtual void Move() { // Boat's Move }
  15. }

之后你突然想起交通工具也是可以鸣笛的,于是加了一个虚函数


  1. class Vehicle
  2. {
  3. public:
  4.     virtual void Move() = 0;
  5.     virtual void MakeSound() = 0;
  6. };

  7. class Car : public Vehicle
  8. {
  9. public:
  10.     virtual void Move() { // Car's Move }
  11.     virtual void MakeSound() { // Car's Sound; }
  12. };

  13. class Boat : public Vehicle
  14. {
  15. public:
  16.     virtual void Move() { // Boat's Move }
  17.     virtual void MakeSound() { // Boat's Sound }
  18. }

牵一发而动全身。为基类增加一个行为后需要影响到它所有的子类。所以我们可以把一些变化的行为抽取出来。


  1. interface IMoveBehavior
  2. {
  3.     virtual void Move() = 0;
  4. };

  5. interface IMakeSoundBehavior
  6. {
  7.     virtual void MakeSound() = 0;
  8. };

当基类需要增加新的行为时,可以这样:


  1. class Vehicle
  2. {
  3. public:
  4.     void PerformMove() { mpMoveBehavior->Move(); }
  5. protected:
  6.     IMoveBehavior* mpMoveBehavior;
  7. };

对于子类,需要做的是选择合适的MoveBehavior


  1. class CarMoveBehavior : public IMoveBehavior
  2. {
  3. public:
  4.     virtual Move() { // Car's Move }
  5. };

  6. class BoatMoveBehavior : public IMoveBehavior
  7. {
  8. public:
  9.     virtual Move() { // Boat's Move }
  10. };

  11. class Car : public Vehicle
  12. {
  13. public:
  14.     Car() { mpMoveBehavior = new CarMoveBehavior; }
  15. };

  16. class Boat : public Vehicle
  17. {
  18. public:
  19.     Boat() { mpMoveBehavior = new BoatMoveBehavior; }
  20. };

也可以用同样的方法增加增加MakeSoundBehavior。

设计原则:找出应用中可能需要变化之处,把它们独立出来,不要和那些不需要变化的代码混在一起。

设计原则:针对接口编程,而不是针对实现编程。

设计原则:多用 组合,少用继承。

 

阅读(772) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~