策略模式

策略模式:

定义了算法族,分别封装起来,让它们之间可以互换;
此模式让算法的变化独立于使用算法的客户;

下面一个简单例子,让我们来演示这个模式。

#include "stdafx.h"

#include <stdio.h>

 

//算法接口类
class IFly

{

public:

    virtual void fly() = 0;

};

 

//实现A算法
class FlyA: public IFly

{

public:

    void fly()

    {

       printf("I am flying! /n");

    }

};

//实现B算法
class FlyB: public IFly

{

public:

    void fly()

    {

       printf("I am flying  with rocket! /n");

    }

};

/*

Object接口类

设计原则:

1:使用组合方式把ObjectFly形为集成到对象中,而不是继续的方式。(多用组合,少用继续)

2:Object中不会改变的方法集中在IObject,将经常变动的方法通过IFly分离出去(真对接口编程,而不是真对实现编程)

*/

 

class IDuck

{

public:

    IDuck():m_pFly(NULL){ }

   

    void SetFly(IFly *pFly)

    {

       if (m_pFly)

       {

           delete m_pFly;

       }

       m_pFly = pFly;

    }

   

    void DuckFly()

    {

       if (m_pFly)

       {

           m_pFly->fly();

       }

    }

   

    ~IDuck()

    {

       if (m_pFly)

       {

           delete m_pFly;

           m_pFly = NULL;

       }

    }

 

protected:

    IFly *m_pFly;

 

};


 // 对象1
class MallardDuck : public IDuck

{

public:

    MallardDuck()

    {

       printf("I am a Mallard Duck! /n ");

       m_pFly = new FlyA();

    }

};

 //对象2

class ModelDuck : public IDuck

{

public:

    ModelDuck()

    {

       printf("I am a Model Duck! /n ");

       m_pFly = new FlyB();

    }

};

 

 

int _tmain(int argc, _TCHAR* argv[])

{

    MallardDuck MyDuck1;

    MyDuck1.DuckFly();

    MyDuck1.SetFly(new FlyB());//对象形为(算法)之间的切换

    MyDuck1.DuckFly();

 

    ModelDuck MyDuck2;

    MyDuck2.DuckFly();

    return 0;

}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值