策略模式
来源:互联网 发布:赵总定制机箱淘宝店 编辑:程序博客网 时间: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.多用组合,少用继承。
将两个类结合起来使用,如同本例一般,这就是组合。这种做法和“继承”不同的地方在于,鸭子的行为不是继承来的,而是和适当的行为对象“组合”来的。
使用组合建立系统具有很大的弹性,不仅可将算法族封装成类,更可以“在运行时动态地改变行为”,只要组合的行为对象符合正确的接口标准即可。
策略模式的定义:定义了算法族,分别封装起来,让他们之间可以互相替换,此模式让算法的变化独立于是用算法的客户。
- 策略模式
- 策略模式
- 策略模式
- 策略模式
- 策略模式
- 策略模式
- 策略模式
- 策略模式
- 策略模式
- 策略模式
- 策略模式
- 策略模式
- 策略模式
- 策略模式
- 策略模式
- 策略模式
- 策略模式
- 策略模式
- 为什么控件的有些属性在代码中可用,但是在设计界面的属性窗口中就没有
- 传言新苹果电视将通过iPad操控
- 现代算法归纳
- 数据结构算法与应用第九章-优先队列
- _IO, _IOR, _IOW, _IOWR 宏的用法与解析
- 策略模式
- asp.net mvc Filter拦截跳转
- OpenGL的几种缓存
- 关于伪静态和真静态的一点心得
- 首发Zend Studio 9.0.3正式版注册破解(2012-05-10更新)
- socket为什么无法绑定?
- mac os svn 识别 .a文件
- MFC练习5:使用非模态对话框
- WordPress备份方法