大話設計模式C++版本-02-策略模式

概念

策略模式:定義了算法家族,分別封裝起來,讓他們之間可以互相替換,此模式讓算法的變化不會影響到用算法的客戶。
注意:與簡單工廠模式相比,使用上只需要知道 Context 類即可

應用場景

  1. 算法會時常變動;
  2. 用幾個類封裝了這些算法且有共同的父類;

一般步驟

  1. 抽象一個算法類
    class Strategy
    {
    public:
    	virtual void Algorithm()=0;
    };
    
  2. 寫具體的子類
    class ConcreateStrategyA : public Strategy
    {
    public:
    	void Algorithm()
    	{
    		printf("ConcreateStrategyA \n");
    	}
    };
    
    class ConcreateStrategyB : public Strategy
    {
    public:
    	void Algorithm()
    	{
    		printf("ConcreateStrategyB \n");
    	}
    };
    
    class ConcreateStrategyC : public Strategy
    {
    public:
    	void Algorithm()
    	{
    		printf("ConcreateStrategyC \n");
    	}
    };
    
  3. 創建一個類,根據不同條件調用不同的策略
    class Context
    {
    public:
    	Context(char algorithm)
    	{
    		this->algorithm = algorithm;
    		switch (algorithm)
    		{
    			case 'A':
    				this->strategy = new ConcreateStrategyA();
    				break;
    			case 'B':
    				this->strategy = new ConcreateStrategyB();
    				break;
    			case 'C':
    				this->strategy = new ConcreateStrategyC();
    				break;
    			default:
    				this->strategy = NULL;
    				break;
    		}	
    	}
    	
    	~Context()
    	{
    		printf("delete strategy%c\n",algorithm);
    		delete strategy;
    	}
    	
    	void ContextInterface()
    	{
    		strategy->Algorithm();
    	}
    	
    private:
    	Strategy *strategy;
    	char algorithm;
    };
    

具體實例

#include <cstdio>
class Strategy // 抽象類-策略類
{
public:
	virtual void Algorithm()=0;
};

class ConcreateStrategyA : public Strategy // 策略A
{
public:
	void Algorithm()
	{
		printf("ConcreateStrategyA \n");
	}
};

class ConcreateStrategyB : public Strategy // 策略B
{
public:
	void Algorithm()
	{
		printf("ConcreateStrategyB \n");
	}
};

class ConcreateStrategyC : public Strategy // 策略C
{
public:
	void Algorithm()
	{
		printf("ConcreateStrategyC \n");
	}
};

#if 0
class Context
{
public:
	Context(Strategy *strategy)
	{
		this->strategy = strategy;
	}
	
	~Context()
	{
		delete strategy;
	}
	
	void ContextInterface()
	{
		strategy->Algorithm();
	}
	
private:
	Strategy *strategy;
};

int main()
{
	Context *context = NULL;
	
	context = new Context(new ConcreateStrategyA());
	context->ContextInterface();
	
	context = new Context(new ConcreateStrategyB());
	context->ContextInterface();
	
	context = new Context(new ConcreateStrategyC());
	context->ContextInterface();
	
	return 0;
}

#else
class Context // 使用策略的類
{
public:
	Context(char algorithm)
	{
		this->algorithm = algorithm;
		switch (algorithm)
		{
			case 'A':
				this->strategy = new ConcreateStrategyA();
				break;
			case 'B':
				this->strategy = new ConcreateStrategyB();
				break;
			case 'C':
				this->strategy = new ConcreateStrategyC();
				break;
			default:
				this->strategy = NULL;
				break;
		}	
	}
	
	~Context()
	{
		printf("delete strategy%c\n",algorithm);
		delete strategy;
	}
	
	void ContextInterface()
	{
		strategy->Algorithm();
	}
	
private:
	Strategy *strategy;
	char algorithm;
};

int main()
{
	Context *context = NULL;
	
	context = new Context('A');
	context->ContextInterface();
	delete context;
	
	context = new Context('B');
	context->ContextInterface();
	delete context;
	
	context = new Context('C');
	context->ContextInterface();
	delete context;
	
	return 0;
}
#endif

總結

策略模式是一種定義了一系列算法的方法,它可以以相同的方式調用所有的算法,減少各種算法類與使用算法類之間的耦合。 --《大話設計模式》

策略模式的 Strategy類層次爲 Context 類定義了一系列可供重用的算法和行爲。繼承有助於析取出這些算法中的公共功能。

參考資料:

《大話設計模式》

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章