C++实现策略模式

1.定义

策略模式是指定义一系列的算法,把每一个算法封装起来,使他们可以相互替换,使得算法可以独立于使用它的客户而变化。

 

2. 组成

环境类(Context): 内部维护一个Strategy对象的引用,对外提供相应功能接口;

策略类(Strategy): 定义算法的一个或多个接口;

具体策略类(ConcreteStrategy): 以Strategy接口实现某个特定算法;


3. 类关系图


4. 效果

优点:策略模式把算法进行归纳,使得算法的切换、扩展更加容易。

缺点:策略使用者需要了解各个具体策略,使得整个模式的封装性不强。


5.C++实现 

实现策略模式时,需要注意的是算法接口的定义。如果能把算法运行所需信息提供完整,避免算法类访问Context,则可减少Context与Strategy之间的耦合。

/*******************/
/* Strategy.h      */
/*******************/
#ifndef __STRATEGY_H__
#define __STRATEGY_H__

class Strategy
{
public:
	virtual void AlgorithmFunction() = 0;
};

class ConcreteStrategyA : public Strategy
{
public:
	void AlgorithmFunction();
};

class ConcreteStrategyB : public Strategy
{
public:
	void AlgorithmFunction();
};

class ConcreteStrategyC : public Strategy
{
public:
	void AlgorithmFunction();
};

#endif //__STATEGY_H__

/********************/
/* Strategy.cpp     */
/********************/
#include "Strategy.h"
#include <stdio.h>

void ConcreteStrategyA::AlgorithmFunction()
{
	printf("我是一只策略A,咿呀咿呀哟~""\n");
}

void ConcreteStrategyB::AlgorithmFunction()
{
	printf("天空一声巨响,策略B闪亮登场~""\n");
}

void ConcreteStrategyC::AlgorithmFunction()
{
	printf("策略C低调撸过…""\n");
}

/******************/
/* Context.h      */
/******************/
#ifndef __CONTEXT_H__
#define __CONTEXT_H__

#include "Strategy.h"

enum enum_StrategyName
{
	enum_val_StrategyA,
	enum_val_StrategyB,
	enum_val_StrategyC
};

class Context
{
public:
	Context(enum_StrategyName strategyName = enum_val_StrategyA);
	void SetStrategy(enum_StrategyName strategyName);
	void WorkFunction();

private:
	Strategy * m_pStrategy;
};

#endif //__CONTEXT_H__

/*******************/
/* Context.cpp     */
/*******************/
#include "Context.h"

Context::Context(enum_StrategyName strategyName/* = enum_val_StrategyA*/)
{
	switch(strategyName)
	{
	case enum_val_StrategyA:
		m_pStrategy = new ConcreteStrategyA();
		break;
	case enum_val_StrategyB:
		m_pStrategy = new ConcreteStrategyB();
		break;
	case enum_val_StrategyC:
		m_pStrategy = new ConcreteStrategyC();
		break;

	default:
		m_pStrategy = new ConcreteStrategyA();
	}
}

void Context::WorkFunction()
{
	m_pStrategy->AlgorithmFunction();
}

/*********************/
/* Main.cpp          */
/*********************/
#include "Context.h"
#include <stdio.h>
#include <conio.h>

int main(int argc, char * argv[])
{
	Context * pContextA = new Context(enum_val_StrategyA);
	Context * pContextB = new Context(enum_val_StrategyB);
	Context * pContextC = new Context(enum_val_StrategyC);

	pContextA->WorkFunction();
	pContextB->WorkFunction();
	pContextC->WorkFunction();

	delete pContextA;
	delete pContextB;
	delete pContextC;

	printf("\n""按下任意键继续…""\n");
	_getch();

	return 0;
}

运行截图:


=========================End===================================

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值