Strategy模式
一.意图
定义一系列的算法,把它们一个个封装起来, 并且使它们可相互替换。本模式使得算法可独立于使用它的客户而变化。
二.适用性
1.许多相关的类仅仅是行为有异。“策略”提供了一种用多个行为中的一个行为来配置一个类的方法。
2.需要使用一个算法的不同变体。例如,你可能会定义一些反映不同的空间/时间权衡的算法。当这些变体实现为一个算法的类层次时[ H O 8 7 ] ,可以使用策略模式。
3.算法使用客户不应该知道的数据。可使用策略模式以避免暴露复杂的、与算法相关的数据结构。
4.一个类定义了多种行为, 并且这些行为在这个类的操作中以多个条件语句的形式出现。将相关的条件分支移入它们各自的S t r a t e g y 类中以代替这些条件语句。
三.结构
四.代码
#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <vector>
#include <math.h>
#include <qxmlstream.h>
#include <QDomDocument>
#include <QDebug>
#include <QApplication>
#include <windows.h>
#include <QLibrary>
#include <unistd.h>
class CStrategy
{
public:
virtual void Algorithminterface(){}
};
class CWatchTVStrategy : public CStrategy
{
public:
virtual void Algorithminterface()
{
qDebug("Watch TV");
}
};
class CPlayGameStrategy : public CStrategy
{
public:
virtual void Algorithminterface()
{
qDebug("Play Game");
}
};
class CPersonContext
{
public:
CPersonContext(CStrategy* strategy)
{
if(m_pStrategy != NULL)
{
delete m_pStrategy;
m_pStrategy = NULL;
}
m_pStrategy = strategy;
}
~CPersonContext()
{
if(m_pStrategy != NULL)
{
delete m_pStrategy;
m_pStrategy = NULL;
}
}
void SetStrategy(CStrategy* strategy)
{
if(m_pStrategy != NULL)
{
delete m_pStrategy;
m_pStrategy = NULL;
}
m_pStrategy = strategy;
}
void ContextInterface()
{
m_pStrategy->Algorithminterface();
}
private:
CStrategy* m_pStrategy = NULL;
};
int main(int argc, char** argv)
{
QApplication app(argc, argv);
CPersonContext* person = new CPersonContext(new CWatchTVStrategy());
person->ContextInterface();
person->SetStrategy(new CPlayGameStrategy());
person->ContextInterface();
return app.exec();
}