现在的位置: 首页 > 综合 > 正文

策略模式(Strategy)

2012年04月29日 ⁄ 综合 ⁄ 共 2464字 ⁄ 字号 评论关闭

策略模式:

【Head First Design Pattern】定义算法族,分别封装起来,让它们之间可以互相替换,此模式让算法的变化独立于使用算法的客户。

通俗概念:

用统一的接口分别对不同类型的数据进行访问。

C++实现代码:

StrategyPattern.h

#pragma once

/*************
 * 第一章: 策略模式
 ************/

#include <iostream>

using namespace std;

//fly action
class CAbstractFlyBehavior
{
public:
	CAbstractFlyBehavior() {}
	virtual ~CAbstractFlyBehavior() {}
	virtual void fly() = 0;
};

class CFlyWithWings : public CAbstractFlyBehavior
{
public:
	virtual void fly()
	{
		cout << "I'm flying." << endl;
	}
};

class CFlyNoWay : public CAbstractFlyBehavior
{
public:
	virtual void fly()
	{
		cout << "I can't fly." << endl;
	}
};

class CFlyRocketPowered : public CAbstractFlyBehavior
{
public:
	virtual void fly()
	{
		cout << "I'm flying with a rocket." << endl;
	}
};

//quack action
class CAbstractQuackBehavior
{
public:
	CAbstractQuackBehavior() {}
	virtual ~CAbstractQuackBehavior() {}
	virtual void quack() = 0;
};

class CQuack : public CAbstractQuackBehavior
{
public:
	virtual void quack()
	{
		cout << "Quack" << endl;
	}
};

class CSqueak : public CAbstractQuackBehavior
{
public:
	virtual void quack()
	{
		cout << "Squeak" << endl;
	}
};

class CMuteQuack : public CAbstractQuackBehavior
{
public:
	virtual void quack()
	{
		cout << "Silence" << endl;
	}
};

//duck
class CDuck
{
public:
	CDuck()
	{
		m_pFlyBehavior   = NULL;
		m_pQuackBehavior = NULL;
	}
	virtual ~CDuck()
	{
	}
	virtual void display()
	{
	}
	void performFly()
	{
		if (m_pFlyBehavior)
		{
			m_pFlyBehavior->fly();
		}
	}
	void performQuack()
	{
		if (m_pQuackBehavior)
		{
			m_pQuackBehavior->quack();
		}
	}
	void swim()
	{
		cout << "All ducks float, even decoys." << endl;
	}
	void setFlyBehavior(CAbstractFlyBehavior *pFlyBehavior)
	{
		if (m_pFlyBehavior && m_pFlyBehavior != pFlyBehavior)
		{
			delete m_pFlyBehavior;
		}
		m_pFlyBehavior = pFlyBehavior;
	}
	void setQuackBehavior(CAbstractQuackBehavior *pQuackBehavior)
	{
		if (m_pQuackBehavior && m_pQuackBehavior != pQuackBehavior)
		{
			delete m_pQuackBehavior;
		}
		m_pQuackBehavior = pQuackBehavior;
	}

	CAbstractFlyBehavior   *m_pFlyBehavior;
	CAbstractQuackBehavior *m_pQuackBehavior;
};

class CMallardDuck : public CDuck
{
public:
	CMallardDuck()
	{
		m_pFlyBehavior   = new CFlyWithWings();
		m_pQuackBehavior = new CQuack();
	}
	~CMallardDuck()
	{
		if (m_pFlyBehavior)
		{
			delete m_pFlyBehavior;
		}
		if (m_pQuackBehavior)
		{
			delete m_pQuackBehavior;
		}
	}
	virtual void display()
	{
		cout << "I'm a real Mallard duck." << endl;
	}
};

class CModelDuck : public CDuck
{
public:
	CModelDuck()
	{
		m_pFlyBehavior   = new CFlyNoWay();
		m_pQuackBehavior = new CQuack();
	}
	virtual void display()
	{
		cout << "I'm a model duck." << endl;
	}
};

StrategyPattern.cpp

#include "StrategyPattern.h"

int main()
{
	CDuck *pMallard = new CMallardDuck();
	pMallard->performQuack();
	pMallard->performFly();
	delete pMallard;

	CDuck *pModel = new CModelDuck();
	pModel->performFly();
	pModel->setFlyBehavior(new CFlyRocketPowered());
	pModel->performFly();
	delete pModel;
}

抱歉!评论已关闭.