Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1062868
  • 博文数量: 77
  • 博客积分: 821
  • 博客等级: 军士长
  • 技术积分: 1905
  • 用 户 组: 普通用户
  • 注册时间: 2011-10-23 16:17
个人简介

学校:上海交通大学软件工程 学历:硕士 行业:从事流媒体移动开发 QQ: 412595942 邮箱:yiikai1987910@gmail.com

文章分类

全部博文(77)

文章存档

2016年(4)

2015年(15)

2014年(16)

2013年(12)

2012年(21)

2011年(9)

分类: C/C++

2014-02-11 14:06:23

      策略模式其实就从字面理解就能知道大概的意思,无非就是解决某种问题的时候,可能有好几种解决方法,这些方法都可以称为策略,无非是选用哪一个的问题,如果看中了哪个策略,只要将这个策略应用到该问题上就可以了。
     从以上的总结中不难看出,其实策略模式的核心思想其实就是将算法实现抽象剥离出对象类(即针对接口编程 , 而不是针对实现编程)
     
      那么策略模式为什么好呢? 接下来先来看个传统的设计方法,也就是最简单的继承
     
      现在有一个鸭子的父类
     

点击(此处)折叠或打开

  1. class cDuck
  2. {
  3. public:
  4.     cDuck();
  5.     ~cDuck();
  6.     void swim();
  7.     virtual void fly() = 0;
  8. };
    里面有一个接口fly,是需要子类去实现的,然后我有了一个家养的鸭子类去重载这个方法
  

点击(此处)折叠或打开

  1. class fDuck : public cDuck
  2. {
  3. public:
  4.     fDuck();
  5.     ~fDuck();
  6.     void fly();
  7. };

  8. void fDuck::fly()
  9. {
  10.     printf("I can't fly\n");
  11. }
因为是家养的所以当然是不能飞的(呵呵),这样,我们就实现了自己养的鸭子的实现,现在看看没有什么问题,但是现在我需要一直野生的鸭子怎么办呢?
    野生的鸭子是可以自己飞的,那你可能会说很简单啊,我只要重载这个fly接口,重现创建一个野鸭子的类就可以了
   

点击(此处)折叠或打开

  1. class yDuck : public cDuck
  2. {
  3. public:
  4.     yDuck();
  5.     ~yDuck();
  6.     void fly();
  7. };

  8. void yDuck::fly()
  9. {
  10.     printf("I can fly\n");
  11. }
没错,这样是没什么问题。可是不知道你们发现没,如果我现在要求出现一只能飞的太空鸭子,你是不是又要去完全的重写一遍fly接口? 这就带来了复用性的问题,就是说以后不管有几个鸭子,只要能飞,我都要去实现这个fly的接口(也就是复制黏贴下),这太恐怖了吧,简直就是灾难,现在的情况用之前总结的话说就是编程依赖于实现了,(如果你不写fly的接口,你就不能完成你的鸭子的创建过程)
这时候,就应该是我们策略模式登场的时候了!!!!!!!!!!!!!!!

      策略模式的思想就是将功能算法这类解决问题的策略剥离出类,这样就独立于类的实现了,通过组合的方式包含在该类中,更进一步的方式就是将策略类抽象出来,通过针对接口进行编程
       修改后的代码:


点击(此处)折叠或打开

  1. class duckfly
  2. {
  3. public:
  4.     duckfly(){};
  5.     ~duckfly(){};
  6.     virtual void fly() = 0;
  7. };
增加了一个对于fly这个功能的抽象类,对于以后不同鸭子的不同飞行方式都是基于这个类的,这个类就是我们的策略基类。
接下来对于野鸭子的飞行方式进行实现

点击(此处)折叠或打开

  1. class cduckfly : public duckfly
  2. {
  3. public:
  4.     cduckfly(){}
  5.     ~cduckfly(){}
  6.     void fly()
  7.     {
  8.         printf("I can fly\n");
  9.     }
  10. };

家养的鸭子:

点击(此处)折叠或打开

  1. class fduckfly : public duckfly
  2. {
  3. public:
  4.     fduckfly(){}
  5.     ~fduckfly(){}
  6.     void fly()
  7.     {
  8.         printf("I can't fly\n");
  9.     }
  10. };

有了这两个公共的飞行类后,各种鸭子类的飞行方法就可以剥离出来了,在这里重新给鸭子的基类一个设定飞行模式的方法,用于动态的改变飞行方法

点击(此处)折叠或打开

  1. class cDuck
  2. {
  3. public:
  4.     cDuck();
  5.     ~cDuck();
  6.     void swim();
  7.     void setFlyMethod(duckfly* tmpfly);
  8.     virtual void fly() = 0;
  9. protected:
  10.     duckfly* m_fly;
  11. };

  12. cDuck::cDuck()
  13. {
  14.     m_fly = NULL;
  15. }

  16. cDuck::~cDuck()
  17. {

  18. }

  19. void cDuck::swim()
  20. {
  21.     printf("I can swim\n");
  22. }

  23. void cDuck::setFlyMethod(duckfly* tmpfly)
  24. {
  25.     m_fly = tmpfly;
  26. }

这样一来,可以发现,不论我想要什么类型的鸭子,最终我都可以通过改变他们的飞行方法让他们重生了。这样就避免了代码重复和复用的问题了
主函数:

点击(此处)折叠或打开

  1. int _tmain(int argc, _TCHAR* argv[])
  2. {
  3.     duckfly* flymt1 = new fduckfly();
  4.     duckfly* flymt2 = new cduckfly();
  5.     cDuck *cd1 = new fDuck();
  6.     cd1->setFlyMethod(flymt1);
  7.     cd1->fly();

  8.     cDuck *cd2 = new yDuck();
  9.     cd2->setFlyMethod(flymt2);
  10.     cd2->fly();

  11.     system("pause");

  12.     return 0;
  13. }

代码还可以进一步优化,这里就不做具体的优化了




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