设计模式-策略模式

策略模式结构图

意图:定义一系列的算法,把它们一个个封装起来, 并且使它们可相互替换。

主要解决:在有多种算法相似的情况下,使用 if...else 所带来的复杂和难以维护。

其中:

  • Strategy(策略) 定义所有支持的算法的公共接口。Context使用这个接口来调用某ConcreteStrategy定义的算法。
  • ConcreteStrategy(具体策略)以Strategy接口实现某具体算法。
  • Context(上下文)用一个ConcreteStrategy对象来配置;维护一个对Strategy对象的引用;可定义一个接口来让Strategy访问它的数据。

应用举例 

 春节回家使用的交通工具。

#include <iostream>
#include <string>
#include <vector>
#include <list>

using namespace std;

//策略抽象类
class Strategy
{
public:
	virtual void useTraffic() = 0;
};

//坐飞机
class StrategyByPlane : public Strategy
{
public:
	virtual void useTraffic()
	{
		cout << "by Plane" << endl;
	}
};

//坐火车
class StrategyByTrain : public Strategy
{
public:
	virtual void useTraffic()
	{
		cout << "by train" << endl;
	}
};

//上下文类
class Context
{
public:
	Context(Strategy *s) : m_s(s) {}

	void useTraffic()
	{
		m_s->useTraffic();
	}
private:
	Strategy *m_s;
};



int main()
{
	Strategy *s1 = new StrategyByPlane;
	Context *c = new Context(s1);
	c->useTraffic();

	getchar();
	return 0;
}

适用性

  •  许多相关的类仅仅是行为有异。“策略”提供了一种用多个行为中的一个行为来配置一个类的方法。
  • 需要使用一个算法的不同变体。例如,定义一些反映不同空间的空间/时间权衡的算法。当这些变体实现为一个算法的类层次时,可以使用策略模式。
  • 算法使用客户不应该知道的数据。可使用策略模式以避免暴露复杂的、与算法相关的数据结构。
  • 一个类定义了多种行为,并且这些行为在这个类的操作中以多个条件语句的形式出现,将相关的条件分支移入它们各自的Strategy类中,以替代这些条件语句。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

灬Sunnnnn

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值