C++设计模式[二十]策略模式

时间:2022-10-01 22:49:28

策略模式当然要讲策略,出现什么情况就创建什么对象,每个对象方法名相同,方法的实现差别很大。这种模式其实也很简单,一看便知道怎么用了。

C++设计模式[二十]策略模式

Strategy:定义所有支持的算法的公共接口。Context使用这个接口来调用某ConcreteStrategy定义的算法;
ConcreteStrategy:实现Strategy接口的具体算法;
Context:使用一个ConcreteStrategy对象来配置;维护一个对Stategy对象的引用,同时,可以定义一个接口来让Stategy访问它的数据。

例子:

#include<iostream>
using namespace std;
/*************************************策略基类****************************************/

class StrategyBase//主要定义了虚函数
{
public:
virtual void multiWay_tour()=0;//说明是纯虚函数(没有实现的虚函数),必须如此声明
};

/*************************************具体策略类****************************************/

class StrategyFirstChild:public StrategyBase//策略子类,主要对父类定义的虚方法进行具体实现
{
public:
void multiWay_tour()
{
cout<<"I'll go tourism on feet"<<endl;
}
};

class StrategySecondChild:public StrategyBase//策略子类,主要对父类定义的虚方法进行具体实现
{
public:
void multiWay_tour()
{
cout<<"I'll go tourism by train"<<endl;
}
};

/*************************************调度类****************************************/

class Context //调度类,根据传进来的参数,选择具体某个策略----待优化<参考教程>
{
private:
StrategyBase *strategyChild;

public:
Context(StrategyBase *child)
{
strategyChild=child;
}
void multiWay_tour()
{
strategyChild->multiWay_tour();
}

};

/*************************************客户端****************************************/
int main()
{
cout<<"测试程序"<<endl;

//“具体策略类”只在定义多个“调度类”时使用
Context *Context_A=new Context(new StrategyFirstChild()),
*Context_B=new Context(new StrategySecondChild()),
*Context_C=new Context(new StrategySecondChild());

//调用方法,只通过“调度类”实现,算法之间的差异已被屏蔽
Context_A->multiWay_tour();
Context_B->multiWay_tour();
Context_C->multiWay_tour();

cout<<endl;
system("pause");
return 0;
}