策略模式

#include<iostream>
using namespace std;

//策略基类
class COperation
{
public:
	COperation(int a,int b):m_nFirst(a),m_nSecond(b){cout<<"1 constructed!\n";}
	virtual ~COperation(){cout<<"1 destructed!\n";};
	virtual double GetResult()
	{
		double dResult=0;
		return dResult;
	}
protected:
	int m_nFirst;
	int m_nSecond;
};

//策略具体类—加法类
class AddOperation : public COperation
{
public:
	AddOperation(int a,int b):COperation(a,b){cout<<"+ constructed!\n";}
	double GetResult()
	{
		return m_nFirst+m_nSecond;
	}
	 ~AddOperation(){cout<<"+ destructed!\n";};
};

//策略具体类—减法类
class SubtractOperation : public COperation
{
public:
	SubtractOperation(int a,int b):COperation(a,b){cout<<"- constructed!\n";}
	double GetResult()
	{
		return m_nFirst-m_nSecond;
	}
	 ~SubtractOperation(){cout<<"- destructed!\n";};
};


//策略具体类—乘法类
class MultiplicationOperation : public COperation
{
public:
	MultiplicationOperation(int a,int b):COperation(a,b){cout<<"* constructed!\n";}
	double GetResult()
	{
		return m_nFirst*m_nSecond;
	}
	 ~MultiplicationOperation(){cout<<"* destructed!\n";};
};

//策略具体类—除法类
class DivisionOperation : public COperation
{
public:
	DivisionOperation(int a,int b):COperation(a,b){cout<<"/ constructed!\n";}
	double GetResult()
	{
		return 1.0*m_nFirst/m_nSecond;
	}
	 ~DivisionOperation(){cout<<"/ destructed!\n";};
};


class Context
{
private:
	COperation* op;
public:
	Context(COperation *temp):op(temp){}
	double GetResult()
	{
		return op->GetResult();
	}
	virtual ~Context(){cout<<"context destructed!\n";}
};

//客户端
int main()
{
	int a,b;
    char c;
    cin>>a>>b;
	cout<<"请输入运算符:";
    cin>>c;
	Context *context;
	COperation *operation;
    switch(c){
		case '+':
			operation=new AddOperation(a,b);	
			break;
		case '-':
			operation=new SubtractOperation(a,b);
			break;
		case '*':
			operation=new MultiplicationOperation(a,b);
			break;
		case '/':
			operation=new DivisionOperation(a,b);
			break;
	}
	context=new Context(operation);
	cout<<context->GetResult()<<endl;
	delete operation;
	delete context;
	return 0;
}


HeadFirst 设计模式之策略模式

#include<iostream>
using namespace std;

/*封装飞行行为*/
class FlyBehavior{
public:
	virtual void fly(){}
};

class FlyWithWings:public FlyBehavior
{
public:
	void fly()
	{
		cout<<"I'm flying!"<<endl;
	}
};

class FlyNoWay:public FlyBehavior{
public:
	void fly()
	{
		cout<<"I can't fly!"<<endl;
	}
};

class FlyRocketPowered:public FlyBehavior{
public:
	void fly()
	{
		cout<<"I am flying with a rocket!"<<endl;
	}
};

/*封装呱呱叫行为*/
class QuackBehavior{
public:
	virtual void quack(){}
};

class Quack:public QuackBehavior{
public:
	void quack()
	{
		cout<<"Quack!"<<endl;
	}
};

class MuteQuack:public QuackBehavior
{
public:
	void quack()
	{
		cout<<"Silence!"<<endl;
	}
};

class Squeak:public QuackBehavior{
public:
	void quack()
	{
		cout<<"Squeak!"<<endl;
	}
};

/*客户*/
/*客户使用封装好的飞行和呱呱叫算法族*/
class Duck{
public:
	Duck(FlyBehavior *t1,QuackBehavior *t2):f(t1),q(t2){}
	void swim()
	{
		cout<<"All ducks float,even decoys!"<<endl;
	}
	virtual void display(){}
	void performQuack()
	{
		q->quack();
	}
	void performFly()
	{
		f->fly();
	}
	void setFlyBehavior(FlyBehavior *t1)
	{
		f=t1;
	}
	void setQuackBehavior(QuackBehavior *t1)
	{
		q=t1;
	}
protected:
	FlyBehavior *f;
	QuackBehavior *q;
};

class MallardDuck:public Duck{
public:
	MallardDuck():Duck(new FlyWithWings(),new Quack()){}/*未释放delete,留作后续解决*/
	void display()
	{
		cout<<"I am a real Mallard duck!"<<endl;
	}
};

class ModelDuck:public Duck{
public:
	ModelDuck():Duck(new FlyNoWay(),new Quack()){}
	void display()
	{
		cout<<"I am a model duck!"<<endl;
	}
};

void print(Duck &d)
{
	d.performQuack();
	d.performFly();
	d.swim();
	d.display();
}


int main(){
	Duck *d1=new MallardDuck();
	print(*d1);
	delete d1;
	Duck *d2=new ModelDuck();
	//print(*d2);
	d2->performFly();
	d2->setFlyBehavior(new FlyRocketPowered());
	d2->performFly();
	delete d2;

	return 0;
}

设计原则:

1.找出应用中可能需要变化之处,把它们独立出来,不要和那些不需要变化的代码混在一起。

2.针对接口编程,而不是针对实现编程。

3.多用组合,少用继承。

将两个类结合起来使用,如同本例一般,这就是组合。这种做法和“继承”不同的地方在于,鸭子的行为不是继承来的,而是和适当的行为对象“组合”来的。

使用组合建立系统具有很大的弹性,不仅可将算法族封装成类,更可以“在运行时动态地改变行为”,只要组合的行为对象符合正确的接口标准即可。

策略模式的定义:定义了算法族,分别封装起来,让他们之间可以互相替换,此模式让算法的变化独立于是用算法的客户。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值