您的位置:首页 > 编程语言 > C语言/C++

c++策略模式strategy

2015-09-29 21:52 489 查看
意图:
       定义一系列的算法,把它们一个个封装起来, 并且使它们可相互替换。本模式使得算法可独立于使用它的客户而变化。
适用性:
      许多相关的类仅仅是行为有异。“策略”提供了一种用多个行为中的一个行为来配置一个类的方法。
      需要使用一个算法的不同变体。例如,你可能会定义一些反映不同的空间/时间权衡的算法。
      算法使用客户不应该知道的数据。可使用策略模式以避免暴露复杂的、与算法相关的数据结构。
      一个类定义了多种行为, 并且这些行为在这个类的操作中以多个条件语句的形式出现。将相关的条件分支移入它们各自的Strategy类中以代替这些条件语句。



#include <iostream>
#include <string>
#include <vector>
using namespace std;

class Strategy
{
public:
virtual void AlgorithomInterface() {};
};

class ConcreteStrategy1 :public Strategy
{
void AlgorithomInterface()
{
cout << "I am  AlgorithomInterface 1" << endl;
}
};

class ConcreteStrategy2 :public Strategy
{
void AlgorithomInterface()
{
cout << "I am  AlgorithomInterface 2" << endl;
}
};

class ConcreteStrategy3 :public Strategy
{
void AlgorithomInterface()
{
cout << "I am  AlgorithomInterface 3" << endl;
}
};

class Context
{
public:
Context(){}
Context(Strategy *strategy) :m_strategy(strategy){}
~Context(){ delete m_strategy; }

void ContextInterface()
{
m_strategy->AlgorithomInterface();
}

private:
Strategy *m_strategy;
};

int main()
{
Context *pContextA = new Context(new ConcreteStrategy1());
Context *pContextB = new Context(new ConcreteStrategy2());

pContextA->ContextInterface();
pContextB->ContextInterface();

delete pContextA;
delete pContextB;

return 0;
}


二我们可以结合简单工厂模式来定义,因为在实际操作的过程中,我们会发现,在main函数中,也就是在客户端使用策略模式时,会创建非常多的Strategy,而这样就莫名的增加了客户端的压力,让客户端的复杂度陡然增加了。那么,我们就可以借鉴简单工厂模式,使策略模式和简单工厂相结合,从而减轻客户端的压力,代码实现如下:

#include <iostream>
#include <string>
#include <vector>
using namespace std;

typedef enum StrategyType
{
strategy1,
strategy2,
strategy3,
}STRATEGYTYPE;

class Strategy
{
public:
virtual void AlgorithomInterface() {};
};

class ConcreteStrategy1 :public Strategy
{
void AlgorithomInterface()
{
cout << "I am  AlgorithomInterface 1" << endl;
}
};

class ConcreteStrategy2 :public Strategy
{
void AlgorithomInterface()
{
cout << "I am  AlgorithomInterface 2" << endl;
}
};

class ConcreteStrategy3 :public Strategy
{
void AlgorithomInterface()
{
cout << "I am  AlgorithomInterface 3" << endl;
}
};

class Context
{
public:
Context(){}
Context(STRATEGYTYPE type)
{
switch (type)
{
case strategy1:
m_strategy = new ConcreteStrategy1;
break;

case strategy2:
m_strategy = new ConcreteStrategy2;
break;

case strategy3:
m_strategy = new ConcreteStrategy3;
break;
default:
break;
}
}

~Context(){ delete m_strategy; }

void ContextInterface()
{
m_strategy->AlgorithomInterface();
}

private:
Strategy *m_strategy;
};

int main()
{
Context *pContextA = new Context(strategy3);
pContextA->ContextInterface();
delete pContextA;

return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: