策略模式 Strategy模式

Strategy模式:

定义了算法家族,分别封装起来,让它们之间可以互相替换。

 基本特点:

        a)根据不同的情况,创建不同的对象

        b)每个对象方法名相同,方法的实现差别很大

组成:

       1个抽象策略;

       n个具体策略(封装了相关的算法)

       1个调度类,它拥有一个策略类的引用 

代码例子:

// Strategy.cpp : 定义控制台应用程序的入口点。
//



#include "stdafx.h"
#include <iostream>
using namespace std;

/************************************************************************/
/* Stragey模式就是将算法封装到一个类里面,然后在调用类里面调用这个类                                                                     */
/************************************************************************/

/*
weaponStrategy类,是所有武器的基类,也就是所有算法的公共接口
*/
class weaponStrategy
{
public:
	virtual void attack() = 0;
};
//下面就是三个具体的算法
class arrow : public weaponStrategy
{
public:
	virtual void attack()
	{
		cout<<"我的武器是绿箭侠的绿箭"<<endl;
	}
};
class sword : public weaponStrategy
{
public:
	virtual void attack()
	{
		cout<<"我的武器是张无忌的倚天剑"<<endl;
	}
};

class knife : public weaponStrategy
{
public:
	virtual void attack()
	{
		cout<<"我的武器是萧十一郎的割鹿刀"<<endl;
	}

};

/*
策略模式所用的就是 聚合 的思想,简单点来说就是一个类中A定义另外一个类的对象B,然后通过B实现本应该在A当中实现的功能
*/
class soldierContext
{
public:
	soldierContext(weaponStrategy* weapon)
	{
		this->pWeapon = weapon;
	}

	void DoAction()
	{
		pWeapon->attack();
	}

	~soldierContext()
	{
		delete pWeapon;
	}


private:
	weaponStrategy* pWeapon;

};

//策略模式是一种定义一系列算法的方法,从概念上来看,所有这些算法完成的都是相同的工作,只是实现不同,
//它可以以相同的方式调用所有的算法,减少了各种算法类于使用算法类之间的耦合。

int _tmain(int argc, _TCHAR* argv[])
{


	/*
	使用弓箭还是割鹿刀还是倚天剑,这三个武器相当于三个策略A、B、C,下面三个策略可以互相转化
	*/
	weaponStrategy* pWeapon = new arrow();
	soldierContext* pSolider = new soldierContext(pWeapon);
	pSolider->DoAction();

	pWeapon = new knife();//转化到割鹿刀策略
	pSolider = new soldierContext(pWeapon);
	pSolider->DoAction();

	pWeapon = new sword();//转化到倚天剑策略
	pSolider = new soldierContext(pWeapon);
	pSolider->DoAction();


	getchar();
	return 0;
}


 

简单工厂模式与策略模式的区别:

简单工厂模式注重不同对象的创建,比如动物类,创建猫类,狗类;

策略模式注重的是多个对象的相同行为,比如上面都是电影DoAction()行为,但是里面的算法实现细节不同。

安静说实话,现在要让自己选择用一个还是不太清除怎么选择,估计以后用的情况多了就明白了,现在只要先理解策略模式的样式就好了)

 

 

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值