Chinaunix首页 | 论坛 | 博客
  • 博客访问: 48609
  • 博文数量: 14
  • 博客积分: 297
  • 博客等级: 二等列兵
  • 技术积分: 547
  • 用 户 组: 普通用户
  • 注册时间: 2012-05-08 21:05
个人简介

努力做自己不喜欢的事情!

文章分类
文章存档

2013年(4)

2012年(10)

我的朋友

分类: C/C++

2012-07-23 19:52:44

策略模式
 
策略模式定义:
    策略模式定义了算法(行为)簇分别封装起来,让他们之间可以相互替换,此模式让算法的变化独立于使用算法的客户。
 
1.找出应用中可能需要变化之处,把它们独立出来,不要和那些不需要变化的代码混在一起。
2.针对接口编程,而不是针对实现编程。
3.多用组合,少用继承。
 
Class Diagram:
Duck(鸭子)的行为Fly(飞)和 行为Quack(叫)抽象出来FlyBehavior和QuackBehavior。
DUCK.h

点击(此处)折叠或打开

  1. #if !defined(_DUCK_H)
  2. #define _DUCK_H
  3. #include "FlyBehavior.h"
  4. #include "QuackBehavior.h"
  5. #include "FlyNoWay.h"
  6. #include "SmallQuack.h"

  7. class Duck
  8. {
  9. public:
  10.     Duck();
  11.     ~Duck();

  12.     void swim();
  13.     
  14.     virtual void display();
  15.     void setQuackBehavior(QuackBehavior* quack);
  16.     void setFlyBehavior(FlyBehavior* fly);
  17. protected:
  18.     void performQuack();
  19.     void performFly();
  20.     
  21. protected:
  22.     FlyBehavior* _flyBehavior;
  23.     QuackBehavior* _quackBehavior;
  24. };

  25. #endif //_DUCK_H

FlyBehavior.h

点击(此处)折叠或打开

  1. #if !defined(_FLYBEHAVIOR_H)
  2. #define _FLYBEHAVIOR_H


  3. class FlyBehavior
  4. {
  5. public:
  6.     virtual void fly() = 0;
  7. };

  8. #endif //_FLYBEHAVIOR_H
QuackBehavior.h

点击(此处)折叠或打开

  1. #if !defined(_QUACKBEHAVIOR_H)
  2. #define _QUACKBEHAVIOR_H


  3. class QuackBehavior
  4. {
  5. public:
  6.     virtual void quack() =0;
  7. };

  8. #endif //_QUACKBEHAVIOR_H
FlyNoWay.h

点击(此处)折叠或打开

  1. #if !defined(_FLYNOWAY_H)
  2. #define _FLYNOWAY_H

  3. #include "FlyBehavior.h"

  4. class FlyNoWay : public FlyBehavior
  5. {
  6. public:
  7.     void fly();
  8. };

  9. #endif //_FLYNOWAY_H
FlyWithWing.h

点击(此处)折叠或打开

  1. #if !defined(_FLYWITHWING_H)
  2. #define _FLYWITHWING_H

  3. #include "FlyBehavior.h"

  4. class FlyWithWing : public FlyBehavior
  5. {
  6. public:
  7.     void fly();
  8. };

  9. #endif //_FLYWITHWING_H
SmallQuack.h

点击(此处)折叠或打开

  1. #if !defined(_SMALLQUACK_H)
  2. #define _SMALLQUACK_H

  3. #include "QuackBehavior.h"

  4. class SmallQuack : public QuackBehavior
  5. {
  6. public:
  7.     void quack();
  8. };

  9. #endif //_SMALLQUACK_H
Squake.h

点击(此处)折叠或打开

  1. #if !defined(_SQUEAK_H)
  2. #define _SQUEAK_H

  3. #include "QuackBehavior.h"

  4. class Squeak : public QuackBehavior
  5. {
  6. public:
  7.     void quack();
  8. };

  9. #endif //_SQUEAK_H

MallardDuck.h

点击(此处)折叠或打开

  1. #if !defined(_MALLARDDUCK_H)
  2. #define _MALLARDDUCK_H

  3. #include "Duck.h"

  4. class MallardDuck : public Duck
  5. {
  6. public:
  7.     MallardDuck();
  8.     ~MallardDuck();
  9.     //virtual void display();
  10. };

  11. #endif //_MALLARDDUCK_H
RedHeadDuck.h

点击(此处)折叠或打开

  1. #if !defined(_REDHEADDUCK_H)
  2. #define _REDHEADDUCK_H

  3. #include "Duck.h"

  4. class RedHeadDuck : public Duck
  5. {
  6. public:
  7.     RedHeadDuck();
  8.     ~RedHeadDuck();
  9.     //virtual void display();
  10. };

  11. #endif //_REDHEADDUCK_H
测试程序Strategy.cpp

点击(此处)折叠或打开

  1. #include "stdafx.h"
  2. #include "Duck.h"
  3. #include "MallardDuck.h"
  4. #include "RedHeadDuck.h"
  5. #include "FlyWithWing.h"
  6. #include "Squeak.h"
  7. #include "MuteQuack.h"
  8. int main(int argc, char* argv[])
  9. {
  10.     printf("Hello World!\n");

  11.     Duck *duck1 = new Duck();
  12.     duck1->display();

  13.     Duck* duck2 = new RedHeadDuck();
  14.     duck2->setFlyBehavior(new FlyWithWing() );
  15.     duck2->setQuackBehavior(new Squeak());
  16.     duck2->display();


  17.     Duck* duck3 = new MallardDuck();
  18.     duck3->setQuackBehavior(new MuteQuack());
  19.     duck3->display();
  20.     return 0;
  21. }
输出:
  1. Hello World!
  2. I cannot fly.
  3. SmallQuack quack!
  4. I can fly with my wing.
  5. Squeak quack!
  6. I cannot fly.
  7. MuteQuack quack!
  8. Press any key to continue

完整的工程代码,VC6.0项目。





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