策略设计模式--学习笔记

 

意图:

定义一系列的算法,把它们一个个封装起来,并且使它们可相互替换。本模式使得算法可独立于使用它的客户而变化。

 

适用环境:

1) 许多相关的类仅仅是行为有异。“策略”提供了一种用多个行为中的一个行为来配置一个类的方法。

2) 需要使用一个算法的不同变体。例如,你可能会定义一些反映不同的空间/时间权衡的算法。当这些变体实现为一个算法的类层次时,可以使用策略模式。

3) 算法使用客户不应该知道的数据。可使用策略模式以避免暴露复杂的、与算法相关的数据结构。

4) 一个类定义了多种行为, 并且这些行为在这个类的操作中以多个条件语句的形式出现。将相关的条件分支移入它们各自的Strategy类中以代替这些条件语句。

 

结构:

 

实现:

Stratey.h文件

#pragma once

 

class stratey

{

public:

     stratey(void);

     virtual ~stratey(void);

     virtual void AlgrithmInterface()=0;

};

 

class ConcreteStrategyA:public stratey

{

public:

     ConcreteStrategyA();

     ~ConcreteStrategyA();

     void AlgrithmInterface();

 

};

 

class ConcreteStrategyB:public stratey

{

     ConcreteStrategyB();

     ~ConcreteStrategyB();

     void AlgrithmInterface();

};

 

Stratey.cpp文件

 

#include "StdAfx.h"

#include <iostream>

using namespace std;

#include "stratey.h"

stratey::stratey(void)

{

}

 

stratey::~stratey(void)

{

     cout<<"~ strategy......."<<endl;

}

 

void stratey:: AlgrithmInterface()

{

}

 

ConcreteStrategyA::ConcreteStrategyA()

{

}

 

ConcreteStrategyA::~ConcreteStrategyA(void)

{

     cout<<"~ ConcretestrategyA......."<<endl;

}

 

void ConcreteStrategyA:: AlgrithmInterface()

{

     cout<<"using A algrithminterface"<<endl;

}

 

ConcreteStrategyB::ConcreteStrategyB()

{

 

}

 

ConcreteStrategyB::~ConcreteStrategyB(void)

{

     cout<<"~ ConcretestrategyB......."<<endl;

}

 

void ConcreteStrategyB:: AlgrithmInterface()

{

     cout<<"using B algrithminterface"<<endl;

}

 

Context.h文件

 

#pragma once

#include "stratey.h"

 

class Context

{

public:

     Context(stratey *stg);

     virtual ~Context(void);

 

     void DoSomething();

private:

     stratey *m_stratey;

};

 

Context.cpp文件

 

#include "StdAfx.h"

#include "Content.h"

 

Context::Context(stratey *stg)

{

     m_stratey=stg;

}

 

Context::~Context(void)

{

     if (m_stratey!=NULL)

     {

         delete m_stratey;  //没有在定义的对象地方释放内存

     }

}

 

void Context::DoSomething()

{

     m_stratey->AlgrithmInterface();

}

 

主函数:

// strategyPattern.cpp : 定义控制台应用程序的入口点。

//

 

#include "stdafx.h"

#include "stratey.h"

#include "Content.h"

#include <iostream>

using namespace std;

 

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

{

     stratey *ps;

     ps=new ConcreteStrategyA();

 

     Context *pc=new Context(ps);

     pc->DoSomething();

 

     if (pc!=NULL)

     {

         delete pc;

     }

 

     return 0;

}

 

结果:

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值