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

定义:

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

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

例子:

// 设计模式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++本身不带反射机制,虽然有实现反射机制的方法,不过本人暂时不会。。。 有机会填坑吧。

时间: 2024-12-14 03:59:03

设计模式学习笔记--策略模式的相关文章

设计模式学习笔记--外观模式

好久没写设计模式的blog了,这次重新回来填坑,先找一个最简单但是却最常用的设计模式来学习,外观模式.其实说是一个设计模式,其实我们在实际的编程中无时无刻不在用外观模式,可以说这个设计模式已经渗透到编程的各个方便,可能我们自己没感觉出来罢了. 一.外观模式的定义 先来看一下外观模式的定义: 外观模式(Facade),为子系统中的一组接口提供一个一致的界面,此模式定义了一个高层的接口,这个接口使得这一系列子系统更加容易使用. 简单解释一下,所谓外观模式,就是在我们设计系统的时候,将若干个子系统的功

学习笔记——策略模式Strategy

策略模式,与模板模式一样,都是为了将接口和算法实现解耦,但策略模式更主要是整体算法的替换,而模板模式主要是流程一致,部分算法的替换. 个人理解为,一般算法替换,使用策略模式,当算法流程一致,可以提取为模板模式.实际中,策略模式,使用组合方式,将算法实现脱离上下文,上下文可以依据需要,使用不同的算法实现子类,效果比继承更好.

设计模式学习之--策略模式

策略模式是什么:首先,策略模式定义了一系列的算法,并将每一个算法封装起来,而且使它们还可以相互替换.策略模式让算法独立于使用它的客户而独立变化.说的有点不太容易理解,在我们面向对象的思想中一般都是结合我们的生活实例,举个现实的例子,我们的动物中有多种不同的鸟,它们都会飞行,都会走路,但它们的飞行方式不同,有些是翱翔,有些是燕子那样飞行,也有会像俯飞的(这个例子有点挫),但是鸟都会飞,它们的飞行策略是不同的,这里飞行就是不同的算法,或许很多不同的鸟会采用一种的飞行方式,也有的鸟不会飞行.这些策略就

&lt;C/C++ 版&gt; 设计模式 学习之 策略模式

策略模式(strategy):它定义了算法家族,分别封装起来,让他们之间可以相互替换,此模式让算法的变化,不会影响到使用算法的用户. 在下面的情况下应当考虑使用策略模式: 1. 如果在一个系统里面有许多类,它们之间的区别仅在于它们的行为,那么使用策略模式可以动态地让一个对象在许多行为中选择一种行为. 2. 一个系统需要动态地在几种算法中选择一种.那么这些算法可以包装到一个个的具体算法类里面,而这些具体算法类都是一个抽象算法类的子类.换言之,这些具体算法类均 有统一的接口,由于多态性原则,客户端可

&lt;C/C++ 版&gt; 设计模式 学习之 策略模式+工厂模式

策略模式是一种定义一系列算法的方法,从概念上来讲,所有这些算法完成的都是相同的工作,只是实现不同,它可以以相同的方法调用所有的算法,减少各种算法类与使用算法类之间的耦合. 策略模式的 strategy (COperate)类层为 context 定义了一些了可供重用的算法或者行为,继承有助于析取这些算法中的公公功能. 策略模式简化了单元测试,因为每个算法都有自己的类,可以通过自己的接口单独测试. 每个算法可以保证自身没有错误 ,修改其中的一个不会影响到其他算法. 测试代码如下: //Stra_F

设计模式学习笔记-工厂模式

一.概述 定义一个用于创建对象的接口,让子类决定实例化哪一个类.工厂方法(Factory Method)使一个类的实例化延迟到其子类: 2.模式中的角色 Product(Map):定义工厂方法所创建的对象的接口. ConcreteProduct(BaiduMap.GaodeMap):具体Product,实现Product接口. Creator(IMapFactory):声明工厂方法,该方法返回一个Product类型的对象. ConcreteCreator(BaiduMapFactory.Gaod

设计模式学习笔记-桥接模式

一.概述 将抽象部分与它的实现部分分离,使它们都可以独立地变化. 二.模式中的角色 Abstraction:定义抽象类的接口:维护一个指向Implementor类型对象的指针: RefinedAbstraction:扩充由Abstraction定义的接口: Implementor:定义具体行为,具体特征的应用接口: ConcreteImplementor:实现Implementor. 三.UML类图 四.代码实现 4.1 桥接模式的实现代码 /// <summary> /// 实现 /// &

设计模式学习笔记-建造者模式

一.概述 将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示: 二.模式中的角色 Builder:为创建一个Product对象的各个部件指定抽象接口: ConcreteBuilder:实现Builder的接口以构造和装配该产品的各个部件:定义并明确它所创建的表示:提供一个检索产品的接口: Director:构造一个使用Builder接口的对象: Product:表示被构造的复杂对象,ConcreteBuilder创建该产品的内部表示并定义它的装配过程:包含定义组成部件的类,

Java-马士兵设计模式学习笔记-命令模式

一.概述 命令模式 二.代码 1.Client.java 1 public class Client { 2 3 public void request(Server server){ 4 server.addCommand(new TextCommand()); 5 server.addCommand(new ImageCommand()); 6 server.doSomething(); 7 } 8 } 2.Server.java 1 public class Server { 2 3 pr