[toc]

策略模式

定义:策略模式定义了算法族,让他们之间可以相互替换,此模式让算法的变化独立于使用算法的客户。

鸭子类设计

  1. #include "vector"
  2. #include "iostream"
  3. #include "algorithm"
  4. using namespace std;
  5. // 定义飞行行为抽象类
  6. class FlyBehavior{
  7. public:
  8. virtual void fly(){};
  9. };
  10. // 飞行行为特化
  11. class FlyWithWinds: public FlyBehavior{
  12. public:
  13. void fly() override {
  14. cout<<" i am flying "<<endl;
  15. }
  16. };
  17. class FlyNoWay: public FlyBehavior{
  18. void fly() override {
  19. cout<<" i can't fly "<<endl;
  20. }
  21. };
  22. class FlyRocket: public FlyBehavior{
  23. void fly() override {
  24. cout<<" i can fly like a rocket "<<endl;
  25. }
  26. };
  27. // 叫声行为
  28. class QuackBehavior{
  29. public:
  30. virtual void quack(){}
  31. };
  32. class Quack: public QuackBehavior{
  33. void quack() override {
  34. cout<<" i can bark bark "<<endl;
  35. }
  36. };
  37. class MeteQuack: public QuackBehavior{
  38. void quack() override {
  39. cout<<"<< Silence >>"<<endl;
  40. }
  41. };
  42. // 所有鸭子基类
  43. class Duck{
  44. public:
  45. FlyBehavior *flyBehavior{};
  46. QuackBehavior *quackBehavior{};
  47. virtual void display(){};
  48. void performFly() const{
  49. flyBehavior->fly();
  50. }
  51. void performQuack() const{
  52. quackBehavior->quack();
  53. }
  54. static void swim(){
  55. cout<<"all ducks can swim..."<<endl;
  56. }
  57. // 用于动态改变行为
  58. void setBehavior(FlyBehavior *fb){
  59. flyBehavior=fb;
  60. }
  61. };
  62. // 模型鸭子
  63. class ModelDuck: public Duck{
  64. public:
  65. ModelDuck(){
  66. flyBehavior=new FlyNoWay();
  67. quackBehavior=new Quack();
  68. }
  69. void display() override {
  70. cout<<"i am a model duck"<<endl;
  71. }
  72. };
  73. class MallarDuck: public Duck{
  74. public:
  75. MallarDuck(){
  76. quackBehavior=new Quack();
  77. flyBehavior=new FlyWithWinds();
  78. }
  79. void display() override {
  80. cout<<" i am a MallarDuck.. "<<endl;
  81. }
  82. };
  83. int main() {
  84. cout<<"hello world CLion"<<endl;
  85. Duck *model=new ModelDuck();
  86. // 调用performFly 该行为被委托给flyBehavior对象,该对象实例为FlyNoWay
  87. model->performFly();
  88. model->setBehavior(new FlyRocket()); // 运行时改变行为
  89. model->performFly();
  90. return 0;
  91. }