Strategy策略模式是在模板方法模式上的一個(gè)改進(jìn),模板方法模式是代碼復(fù)用,這里用組合來(lái)解決將變化的代碼從“堅(jiān)持相同的代碼”中分開(kāi),從而產(chǎn)生Strategy策略模式。 示例代碼:
#include <iostream>
using namespace std;
class NameStrategy{
public:
virtual void greet() = 0;
};
class SayHi:public NameStrategy{
public:
void greet(){cout <<"Hi!How's it going?"<<end;}
};
class Ignore:public NameStrategy{
public:
void greet(){cout << "(Pretent I don't see you)" <<endl;}
};
class Admission:public NameStrategy{
public:
void greet(){cout<<"I'm sorry.I forgot your name."<<endl;}
};
//The "Context" controls the strategy:
class Context{
NameStrategy& strateagy;
pubic:
Context(NameStrategy& strat):strategy(strat){}
void greet()
{strategy.greet();}
};
int main()
{
SayHi sayhi;
Ignore ignore;
Admission admission;
Context c1(sayhi),c2(ignore),c3(admission);
c1.greet();
c2.greet();
c3.greet();
}
在main()中就可以看到,運(yùn)行時(shí)的策略選擇。
Chain of Responsibility職責(zé)鏈模式可看作是一個(gè)策略對(duì)象的遞歸調(diào)用,本質(zhì)是嘗試多個(gè)解決方法,直到找到一個(gè)起作用的。實(shí)際上它是個(gè)鏈表,可動(dòng)態(tài)創(chuàng)建。這里我們可以用STL來(lái)實(shí)現(xiàn)。
示例代碼:
#include <iostream>
#include <vector>
using namespace std;
enum Answer(NO.YES);
class GimmeStrategy{
public:
virtual Answer canIHave()=0;
virtual ~GimmeStrategy();
};
class AsdRom:public GimmeStrategy{
public:
Answer canIHave(){
cout << "Moom?Can I have this?"<<endl;
return NO;}
};
class AsdDad:public GimmeStrategy{
public:
Answer canIHave(){
cout << "Dad,I really need this!" <<endl;
return NO;}
};
class AsdGrandpa:public GimmeStrategy{
public:
Answet canIHave(){
cout<<"Grandpa.is it my birthday yet?"<<endl;
return YES;}
};
class Gimme:public GimmeStrategy{
vector<GimmeStrategy*> chain;
public:
Gimme(){
chain.push_back(new AskMom());
chain.push_back(new AskDad());
chain.push_back(new AskGrandpa());
chain.push_back(new AskGrandma());
}
Answer canIHave(){
vector<GimmeStrategy*>::iterator it = chain.begin();
while(it != chain.end())
if(*it++)->canIHave()==YES)
return YES;
cout << "Whiiiiinne!"<<endl;
retunr NO;
}
~Gimme(){purge(chain);}
};
int main()
{
Gimme chain;
chain.canIHave();
}
在GOF的原著中,側(cè)重于鏈表的創(chuàng)建,由于STL的存在,創(chuàng)建鏈表變得很輕松。