码迷,mamicode.com
首页 > 其他好文 > 详细

设计模式学习笔记--策略模式

时间:2015-06-12 17:26:45      阅读:154      评论:0      收藏:0      [点我收藏+]

标签:设计模式   编程技巧   软件工程   策略模式   工厂   

定义:

策略模式定义了一系列的算法,并将每一个算法封装起来,而且使它们还可以相互替换。策略模式让算法独立于使用它的客户而独立变化。


我们在使用一些功能时,有时有很多种实现方法,或者多种结果,但是都有同样的使用方法,即调用接口,这就是策略模式。


例子:

// 设计模式Demo.cpp : 定义控制台应用程序的入口点。
//

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


//交通策略基类,定义一个策略接口
class TrafficStrategyBase
{
public:
	virtual void goHome() = 0;
};

//步行策略
class WalkStragety : public TrafficStrategyBase
{
public:
	void goHome() override
	{
		cout<<"go home on foot"<<endl;
	}
};

//开车策略
class DriveStrategy : public TrafficStrategyBase
{
public:
	void goHome() override
	{
		cout<<"go home by car"<<endl;
	}
};

//客户端
int _tmain(int argc, _TCHAR* argv[])
{
	
	//使用开车策略
	TrafficStrategyBase* strategy = new DriveStrategy();
	strategy->goHome();

	//使用步行策略
	strategy = new WalkStragety();
	strategy->goHome();

	system("pause");

	return 0;
}
结果:
go home by car
go home on foot

上面是一个最简单的策略模式,其实就是一个C++的多态,使用父类指针调用子类功能,而不必知道子类具体是什么。
但是这个例子有很多弊病,在客户端需要知道各种模式不利于修改。

下面是一个简单的优化,将策略模式和简单工厂模式结合:

// 设计模式Demo.cpp : 定义控制台应用程序的入口点。
//

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


//交通策略基类,定义一个策略接口
class TrafficStrategyBase
{
public:
	virtual void goHome() = 0;
};

//步行策略
class WalkStragety : public TrafficStrategyBase
{
public:
	void goHome() override
	{
		cout<<"go home on foot"<<endl;
	}
};

//开车策略
class DriveStrategy : public TrafficStrategyBase
{
public:
	void goHome() override
	{
		cout<<"go home by car"<<endl;
	}
};

enum TrafficStrategy
{
	Walk,Drive
};
//简单工厂类(策略工厂)
class StrategyFactory
{
public:
	TrafficStrategyBase* CreateStrategy(TrafficStrategy s)
	{
		switch (s)
		{
		case Walk:
			return new WalkStragety();
		case Drive:
			return new DriveStrategy();
		default:
			return nullptr;
		}
	}
};


//客户端
int _tmain(int argc, _TCHAR* argv[])
{
	
	//使用开车策略回家
	StrategyFactory* factory = new StrategyFactory();
	factory->CreateStrategy(Drive)->goHome();

	//使用步行策略回家
	factory->CreateStrategy(Walk)->goHome();

	system("pause");

	return 0;
}

这里,客户端就与各种策略本身没有关系了,我们只需要修改简单工厂的参数,就可以创建相应的策略,用相应的方法进行操作了。参数可以改成配置文件中读取的字符串,更加利于扩展。

更进一步,我们可以使用工厂方法模式+反射,不需要修改客户端代码可以更改使用的策略。但是C++本身不带反射机制,虽然有实现反射机制的方法,不过本人暂时不会。。。 有机会填坑吧。


设计模式学习笔记--策略模式

标签:设计模式   编程技巧   软件工程   策略模式   工厂   

原文地址:http://blog.csdn.net/puppet_master/article/details/46472911

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!