head first 设计模式 策略模式

时间:2021-12-03 21:57:32

HEAD FIRST:策略模式定义了算法族,分别封装起来,让它们之间可以互相替换,此模式让算法的变化独立于使用算法的客户。

设计模式:定义一系列的算法,把它们一个个封装起来,并且使它们可以相互替换。本模式使得算法可独立于它的客户而变化。

大话设计模式:它定义了算法家族,分别封装起来,让它们之间可以互相替换,此模式让算法的变化,不会影响到使用算法的客户。

 

使用这个模式的原因:

用许多的算法对一类进行计算。那么如果把这些算法强行编码到这个类当中。其实是不可取的.因为很多时候下不同的情况下使用不同的算法。如果要添加新的算法也比较麻烦。如果一次性就包含了所有的算法那就很庞大了。

 

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

这里变化的代码是说.各种可能会变化的Strategy.也就是一些行为或者算法.把会变化的部分取出来并“封装”起来,好让其他部分不受到影响。

 

设计原则二:针对接口编程:关键在于多态,执行时可以根据实际情况执行到真正的行为,不会被绑定到固定的行为上。通常来说,变量的声明类型一遍是抽象类或者接口。如此,只要是具体实现次超类型的类所产生的对象,都可以指定给这个声明的变量。也就是说。声明类的时候不需要理会以后执行时候对应的真正的类型对象。

 

设计原则三:多用组合 少用继承.

head first 设计模式 策略模式

小理解:

Context中有一个Strategy的引用.他可以在Strategy的子类来实例化.也可以动态的改变..赋予某一个子类的实例.然后在Context中用一个方法来实现这个引用->Algorithminterface()...差不多就是这个意思...

 

如下:Duck类是 Context

然后FlyBehavior QuackBehavior是Strategy 类

在Duck类中的两个引用

 FlyBehavior* flys;

 QuackBehavior *quas;

好吧~~基本明白了吧~~

 

  1 #include "stdafx.h"
  2 #include<iostream>
  3 using namespace std;
  4 class FlyBehavior
  5 {
  6 public:
  7     virtual void fly()=0;
  8 };
  9 
 10 class QuackBehavior
 11 {
 12 public:
 13     virtual void quack()=0;
 14 };
 15 class guaguaQuack:public QuackBehavior
 16 {
 17     virtual void quack()
 18     {
 19         cout<<"guaguaQuack"<<endl;
 20     }
 21 };
 22 class wangwangQuack:public QuackBehavior
 23 {
 24     virtual void quack()
 25     {
 26         cout<<"wangwangQuack"<<endl;
 27     }
 28 };
 29 class noQuack:public QuackBehavior
 30 {
 31     virtual void quack()
 32     {
 33         cout<<"keepSilent"<<endl;
 34     }
 35 };
 36 class CanFly:public FlyBehavior
 37 {
 38     virtual void fly()
 39     {
 40         cout<<"I can fly"<<endl;
 41     }
 42 };
 43 class CannotFly:public FlyBehavior
 44 {
 45     virtual void fly()
 46     {
 47         cout<<"I cannot fly"<<endl;
 48     }
 49 };
 50 
 51 class Duck
 52 {
 53 public:
 54     FlyBehavior* flys;
 55     QuackBehavior *quas;
 56     virtual void display()=0;
 57     void setFlyBehavier(FlyBehavior *f)
 58     {
 59         flys = f;
 60     }
 61     void setQuackBehavior(QuackBehavior *q)
 62     {
 63         quas = q;
 64     }
 65     void performFly()
 66     {
 67         flys->fly();
 68     }
 69     void performQua()
 70     {
 71         quas->quack();
 72     }
 73     void performSwim()
 74     {
 75         cout<<"i can swim...all the ducks"<<endl;
 76     }
 77 };
 78 
 79 class modelDuck:public Duck
 80 {
 81 public:
 82     modelDuck()
 83     {
 84         flys = new CannotFly;
 85         quas = new noQuack;
 86     }
 87     virtual void display()
 88     {
 89         cout<<"this is a model duck"<<endl;
 90     }
 91 };
 92 
 93 int _tmain(int argc, _TCHAR* argv[])
 94 {
 95     Duck *d = new modelDuck;
 96     d->display();
 97     d->performFly();
 98     d->setFlyBehavier(new CanFly);
 99     d->performFly();
100     //d->performQua();
101     //d->performSwim();
102     return 0;
103 }