C++实现策略模式

来源:互联网 发布:怎样做一个绅士知乎 编辑:程序博客网 时间:2024/05/16 05:29

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===================================

0 0
原创粉丝点击