策略模式

一、策略模式的定义:

策略模式定义了一组算法,把其中的每个算法分别封装起来,并且使他们之间可以互换。策略模式使用的就是面向对象的继承和多态机制。


二、策略模式的组成部分:

1、一个抽象类,它是算法或策略的抽象,它定义的每个策略必须实现的方法和属性。

2、具体的实现类,就是具体的策略,根据具体情况有不同的实现,每个类的内部实现差别可能很大。

2、一个封装角色,可以做它为调度类,起承上启下的的作用,它屏蔽高层对策略的直访问,封装可能存在的变化。


三、接下来看一下代码示例:

#include <iostream>
using namespace std;
class Strategy        //定义一个抽象的策略角色
{
public:
	virtual void show() = 0;
};


class A : public Strategy    //具体的策略角色A
{
public:
	void show()
	{
		cout<<"我是策略A\n";
	}
};
class B :public Strategy     //具体的策略B
{
public:
	void show()
	{
		cout<<"我是策略B\n";
	}
};
class C :public Strategy	//具体的策略C
{
public:
	void show()
	{
		cout<<"我是策略C\n";
	}
};
                             
class Context           //封装角色
{
private:
	Strategy *StrategyChild;
public:
	Context(Strategy *child)
	{
		StrategyChild = child;
	}
	void display()
	{
		StrategyChild->show();
	}
};
void main()
{
	Context *ContextA = new Context(new A);   //调用角色A
	ContextA->display();
	Context *ContextB = new Context(new B);   //调用角色B
	ContextB->display();
	Context *ContextC = new Context(new C);   //调用角色C
	ContextC->display();
	system("pause");
}
看一下执行结果




四、策略模式的优点:

1、算法可以自由切换,只要实现了抽象策略,它就是策略家族的一员,通过封装角色对其进行封装,保证对外提供”可自由切换“的策略。

2、避免使用多重条件判断,是系统更加灵活,并且易于扩展。

既然有优点,当然缺点也少不了:

1、每一个策略都是一个类,复用的可能性小,当策略众多时,类数量也是巨大的。

2、所有策略都必须对外暴漏,上层模块必须知道有哪些策略存在,才能知道,自己可以执行哪个策略,这与迪米特法则相违背。


五、策略模式的使用场景

1、多个类只在算法和行为上稍有不同的场景

2、算法需要自由切换的场景

3、需要屏蔽算法规则的场景


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值