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 }
head first 设计模式 策略模式