设计模式之策略模式

本文介绍了策略模式,强调其核心在于算法的复用。通过示例代码展示如何在VS2012中使用策略模式,说明添加或修改算法只需在具体策略类中操作,而不会影响环境类,符合开闭原则,易于复用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

      上篇我们讲了迭代器模式,这篇我们再来讲一下使用率很高的策略模式,策略模式的本质就是实现算法的复用,将环境调用中的算法抽象出来单独为类,环境调用就只调用算法的抽象类,要添加或修改算法时就只修改算法的具体类就可以了,不影响环境类,符合开闭原则,非常方便。


策略模式:

以下代码在VS2012上编译通过


.h文件


class Strategy//抽象算法策略类
{
public :
	virtual void algorithm();
};

class ConcreteStrategy:public Strategy//具体算法策略类1
{
public: 
	void algorithm();//算法1
};
class ConcreteStrategy2:public Strategy//具体算法策略类2
{
public: 
	void algorithm();//算法2
};

class Environment//环境调用类
{
private:
	Strategy* m_strategy;
public:
	Environment();
	void setStrategy(Strategy* strategy_);
	Strategy* getStrategy();
	
};

.cpp文件


void Strategy::algorithm()
 { 
    cout<<"this is algorithm in Strategy"<<endl; 
 }
 
 void ConcreteStrategy::algorithm()
 {
      cout<<"this is algorithm1 in ConcreteStrategy"<<endl; 
 }

 void ConcreteStrategy2::algorithm()
 {
     cout<<"this is algorithm1 in ConcreteStrategy2"<<endl; 
 }

 Environment::Environment()
 {
	 m_strategy=NULL;
 }

 void Environment::setStrategy(Strategy* strategy_)
 {
	 m_strategy=strategy_;
 }

 Strategy* Environment::getStrategy()
 {
	 if(m_strategy==NULL)
	 {
		 cout<<"please init m_strategy with Strategy"<<endl;
	 }
	 return m_strategy;
 }
调用文件

int _tmain(int argc, _TCHAR* argv[])
{
	
	Environment* mEnv=new Environment();//创建调用环境
	Strategy* mStrategy=new ConcreteStrategy();//创建具体的算法策略1
        mEnv->setStrategy(mStrategy);//设置该环境下要调用的具体算法策略1
        mEnv->getStrategy()->algorithm();//在该环境下执行具体算法策略1

	Strategy* mStrategy2=new ConcreteStrategy2();//创建具体的算法策略2
	mEnv->setStrategy(mStrategy2);//设置该环境下要调用的具体算法策略2
        mEnv->getStrategy()->algorithm();//在该环境下执行具体算法策略2

	return 0;
}



执行结果:

this is algorithm1 in ConcreteStrategy

this is algorithm1 in ConcreteStrategy2


       以上调用可以看出在策略模式下,要添加一个算法非常方便,只要添加一个具体类继承于抽象算法类就可以了,然后调用的时候只需要在调用环境里设置一下你要调用的算法,最后就可以调用该算法了,该算法和具体调用环境耦合度非常低,所以其他任何调用环境都可以复用该算法了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值