head first 设计模式 策略模式
HEAD FIRST:策略模式定义了算法族,分别封装起来,让它们之间可以互相替换,此模式让算法的变化独立于使用算法的客户。
设计模式:定义一系列的算法,把它们一个个封装起来,并且使它们可以相互替换。本模式使得算法可独立于它的客户而变化。
大话设计模式:它定义了算法家族,分别封装起来,让它们之间可以互相替换,此模式让算法的变化,不会影响到使用算法的客户。
使用这个模式的原因:
用许多的算法对一类进行计算。那么如果把这些算法强行编码到这个类当中。其实是不可取的.因为很多时候下不同的情况下使用不同的算法。如果要添加新的算法也比较麻烦。如果一次性就包含了所有的算法那就很庞大了。
设计原则一:找出应用中可能需要变化之处,把他们独立出来,不要和那些不需要变化的代码混在一起.
这里变化的代码是说.各种可能会变化的Strategy.也就是一些行为或者算法.把会变化的部分取出来并“封装”起来,好让其他部分不受到影响。
设计原则二:针对接口编程:关键在于多态,执行时可以根据实际情况执行到真正的行为,不会被绑定到固定的行为上。通常来说,变量的声明类型一遍是抽象类或者接口。如此,只要是具体实现次超类型的类所产生的对象,都可以指定给这个声明的变量。也就是说。声明类的时候不需要理会以后执行时候对应的真正的类型对象。
设计原则三:多用组合 少用继承.
小理解:
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 }