您的位置:首页 > 其它

策略模式

2010-06-09 12:21 295 查看
在工作中老是看到一大串的 switch,if…else语句,这样的程序分支太多,可谓是丑陋的代码。用策略模式可以部分解决这种问题。我们定义一系列的策略,这样就可以根据客户改变策略。比如做网络协议的时候,客户有自己的协议,我们只需把客户的协议封装好,替换原有的策略,也就是原来的协议就好了,而不用大量的switch判断。
结构图:



示例代码:
#ifndef _CONTEXT_H
#define _CONTEXT_H
#include "Strategy.h"
class Context
{
private:
StrategyInterface *_strategy;

public:
Context(StrategyInterface *strategy):_strategy(strategy)
{
}

void set_strategy(StrategyInterface *strategy)
{
_strategy = strategy;
}

void execute()
{
_strategy->execute();
}
};
#endif

#ifndef _STRATEGY_H
#define _STRATEGY_H
class StrategyInterface
{
public:
virtual void execute() = 0;
};
#endif

#ifndef _CSTRATEGY_H
#define _CSTRATEGY_H
#include "Strategy.h"
#include <iostream>
using namespace std;
class StrategyA: public StrategyInterface
{
public:
virtual void execute()
{
cout << "Called StrategyA execute method" << endl;
}
};

class StrategyB: public StrategyInterface
{
public:
virtual void execute()
{
cout << "Called StrategyB execute method" << endl;
}
};

class StrategyC: public StrategyInterface
{
public:
virtual void execute()
{
cout << "Called StrategyC execute method" << endl;
}
};
#endif

#include "Context.h"
#include "CStrategy.h"

int main(int argc, char *argv[])
{
StrategyA concreteStrategyA;
StrategyB concreteStrategyB;
StrategyC concreteStrategyC;

Context contextA(&concreteStrategyA);
Context contextB(&concreteStrategyB);
Context contextC(&concreteStrategyC);

contextA.execute();
contextB.execute();
contextC.execute();

contextA.set_strategy(&concreteStrategyB);
contextA.execute();
contextA.set_strategy(&concreteStrategyC);
contextA.execute();

system("pause");
return 0;
}


在网络编程时,多协议的封装;做算法时,不同算法的封装都可以使用策略模式。把“坏味道的代码”,重构成简洁可复用的代码。高内聚,低耦合。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: