【设计模式:strategy pattern】

#include <iostream>
#include <sstream>
#include <cstdio>
#include <ctime>
#include <chrono>
#include <thread>

class ContextInterface{
public:
	int NContext;
};

class StrategyInterface{
public:
	virtual ~StrategyInterface( void ){};
	virtual void AlgorithmProcedure( const ContextInterface& context ) = 0;
};

class ConcreteStrategy_B : public StrategyInterface{
class dtor{
public:
	~dtor( void ){
		if( ConcreteStrategy_B::pInst )
			delete ConcreteStrategy_B::pInst;
		ConcreteStrategy_B::pInst = nullptr;
	}
};

private:
	ConcreteStrategy_B( void ) {}
	~ConcreteStrategy_B( void ){StrategyInterface::~StrategyInterface();}
public:
	explicit ConcreteStrategy_B( const ConcreteStrategy_B&) = delete;
	ConcreteStrategy_B( ConcreteStrategy_B&&) = delete;
	virtual void AlgorithmProcedure( const ContextInterface& context ) override{
		char _MsgBuf[ 64 ];
		sprintf( _MsgBuf,
				"AlgorithmProcedure B is functioning using NContext:\t%d\n",
				context.NContext );
		std::ostringstream oss;
		oss << _MsgBuf;
		std::cout << oss.str();
	}
	
	static ConcreteStrategy_B& getInstance( void ){
		if( !pInst ) {
			pInst = new ConcreteStrategy_B;
			static dtor d;
		}
		return *pInst;
	}
protected:
	static ConcreteStrategy_B *pInst;
};
ConcreteStrategy_B *ConcreteStrategy_B::pInst = nullptr;


class ConcreteStrategy_A : public StrategyInterface{
class dtor{
public:
	~dtor( void ){
		if( ConcreteStrategy_A::pInst )
			delete ConcreteStrategy_A::pInst;
		ConcreteStrategy_A::pInst = nullptr;
	}
};
private:
	ConcreteStrategy_A( void ){}
	~ConcreteStrategy_A( void ){  StrategyInterface::~StrategyInterface();}
public:
	explicit ConcreteStrategy_A( const ConcreteStrategy_A&) = delete;
	ConcreteStrategy_A( ConcreteStrategy_A&&) = delete;
	virtual void AlgorithmProcedure( const ContextInterface& context ) override{
		char _MsgBuf[ 64 ];
		sprintf( _MsgBuf,
				"AlgorithmProcedure A is functioning using NContext:\t%d\n",
				context.NContext );
		std::ostringstream oss;
		oss << _MsgBuf;
		std::cout << oss.str();
	}

	static ConcreteStrategy_A& getInstance( void ){
		if( !pInst ){
			pInst = new ConcreteStrategy_A;
			static dtor d;
		}
		return *pInst;
	}
protected:
	static ConcreteStrategy_A *pInst;
};
ConcreteStrategy_A *ConcreteStrategy_A::pInst = nullptr;


class StrategyFactory{
public:
	virtual StrategyInterface *getConcreteStrategy( void ) const = 0;
	virtual ~StrategyFactory( void ){}
};
class StrategyAFactory : public StrategyFactory{
public:
	virtual StrategyInterface *getConcreteStrategy( void ) const override{
		puts("Strategy A Factory produced a ConcretAlgorithm A");
		return &ConcreteStrategy_A::getInstance();
	}
};
class StrategyBFactory : public StrategyFactory{
public:
	virtual StrategyInterface *getConcreteStrategy( void ) const override{
		puts("Strategy B Factory produced a ConcretAlgorithm B");
		return &ConcreteStrategy_B::getInstance();
	}
};

class WidgetApplication{
protected:
	StrategyInterface *pStrategy;
public:
	WidgetApplication( const StrategyFactory *factory ){
		pStrategy = factory->getConcreteStrategy();
		puts("WidgetApplication Strategy initialized by factory");
	}
	void StrategySetter( const StrategyFactory* factory){
		pStrategy = factory->getConcreteStrategy();
		puts("WidgetApplication Strategy altered by factory");
	}
	void function( void ){
		srand( (unsigned int )time( nullptr ));
		ContextInterface context{ rand() % 1000 + 1 };
		pStrategy->AlgorithmProcedure( context );
	}
};

int main( void ){
	StrategyAFactory stratAFact;
	StrategyBFactory stratBFact;
	WidgetApplication WApp( &stratAFact );
	puts( "------------------------");
	WApp.function();
	puts( "------------------------");
	std::this_thread::sleep_for( std::chrono::milliseconds( 1000 ) );
	WApp.StrategySetter( &stratBFact );
	puts( "------------------------");
	WApp.function();
	return 0;
}

 

  • 8
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

XNB's Not a Beginner

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值