设计模式(C++实现)(十六)——策略模式

示例问题:

一个问题,有三种解决方法,每种解决方法,适用于不同的场景,灵活设计切换每种解决方法来解决该问题,并可新增解决方法。

分析:

要能灵活的切换解决问题的方法,且能够灵活新增方法。

解决方案:

Strategy.h

在该文件中,实现了策略的基类,及三个策略的子类

#pragma once

#include <iostream>

//策略基类
class IStrategy
{
public:
	IStrategy()
	{

	}
	virtual ~IStrategy()
	{

	}

	virtual void AlgorithmInterface() = 0;
};

//策略A类
class CConcreteStrategyA : public IStrategy
{
public:
	CConcreteStrategyA()
	{

	}
	virtual ~CConcreteStrategyA()
	{

	}

	void AlgorithmInterface()
	{
		std::cout << "算法A执行" << std::endl;
	}
};

//策略B类
class CConcreteStrategyB : public IStrategy
{
public:
	CConcreteStrategyB()
	{

	}
	virtual ~CConcreteStrategyB()
	{

	}

	void AlgorithmInterface()
	{
		std::cout << "算法B执行" << std::endl;
	}
};

//策略C类
class CConcreteStrategyC : public IStrategy
{
public:
	CConcreteStrategyC()
	{

	}
	virtual ~CConcreteStrategyC()
	{

	}

	void AlgorithmInterface()
	{
		std::cout << "算法C执行" << std::endl;
	}
};

Question.h

问题类

#pragma once

#include "Strategy.h"

class CQuestion
{
public:
	CQuestion()
	{
	}
	virtual ~CQuestion()
	{

	}

	void SetStrategy(IStrategy* pStrategy)
	{
		m_pStrategy = pStrategy;
	}

	void Solve()
	{
		m_pStrategy->AlgorithmInterface();
	}

private:
	IStrategy* m_pStrategy;
};

main.cpp

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

#include "Question.h"

int main()
{
	CQuestion Question;

	//用策略A解决该问题
	IStrategy* pStrategyA = new(std::nothrow) CConcreteStrategyA();
	if (nullptr != pStrategyA)
	{
		Question.SetStrategy(pStrategyA);
		Question.Solve();
		delete pStrategyA;
		pStrategyA = nullptr;
	}

	//用策略B解决该问题
	IStrategy* pStrategyB = new(std::nothrow) CConcreteStrategyB();
	if (nullptr != pStrategyB)
	{
		Question.SetStrategy(pStrategyB);
		Question.Solve();
		delete pStrategyB;
		pStrategyB = nullptr;
	}

	//用策略C解决该问题
	IStrategy* pStrategyC = new(std::nothrow) CConcreteStrategyC();
	if (nullptr != pStrategyC)
	{
		Question.SetStrategy(pStrategyC);
		Question.Solve();
		delete pStrategyC;
		pStrategyC = nullptr;
	}

	system("pause");
	return 0;
}

运行结果

策略模式的使用:

策略模式:它定义了算法家族,分别封装起来,让他们之间可以互相替换,此模式让算法的变化,不会影响到使用算法的客户。

策略模式是一种定义一些列算法的方法,从概念上来看,所有这些算法完成的都是相同的工作,只是实现不同,他可以以相同的方式调用所有的算法,减少了各种算法类与使用算法类之间的耦合。如果要新增解决问题的方法,只需新增新的策略子类。

何时使用策略模式:

在不同场景下需要切换不同的解决问题的方法。

 

返回目录:设计模式(C++实现)(总)

上一篇:设计模式(C++实现)(十五)——桥接模式

下一篇:设计模式(C++实现)(十七)——原型模式

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值