策略模式

来源:互联网 发布:赵总定制机箱淘宝店 编辑:程序博客网 时间:2024/06/01 10:42
#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.多用组合,少用继承。

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

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

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

原创粉丝点击