欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

设计模式学习之C++实现的策略模式实例讲解

程序员文章站 2022-03-26 17:52:54
1.策略模式简介 英文名称 strategy 主要目的 定义一系列算法,把它们一个一个封装起来,并且使它们可以相互替换。策略使得算法可以独立于使用它的客户而变化。 使用场景 1.许多相关的类仅仅是行...

1.策略模式简介

英文名称

strategy 主要目的

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

1.许多相关的类仅仅是行为有差别;

2.需要使用一个算法的不同变体时;

3.算法使用了客户不需要的数据。通过策略模式,可以避免暴露于算法有关的数据结构;

4.一个类定义了多种行为,并且这些行为在这个类的操作中是以多个判断语句的形式出现的。

2.策略模式代码示例

测试平台

1.开发语言:c++

2.开发工具:vs2015

3.操作:win7 x64 代码说明

1.strategy–抽象策略类,用来定义抽象接口;

2.concreatestrategynormal、concreatestrategysilver、concreatestrategygold–具体策略类,继承于抽象策略类,实现不同的计算策略;

3.context–上下文类,用一个具体策略来配置,实现不同策略的调用。

注意:

1.本例用策略模式来实现理发店消费金额结算;

2.通过策略模式,我们可以直接调整具体的策略,而不影响外部调用。

具体代码

#include 
using namespace std;

//本例用策略模式来实现理发店消费金额结算
//结算规则如下:
//普通会员:打9.5折
//银牌会员:打8折
//金牌会员:打6折

//抽象算法类,用来定义抽象接口
class strategy
{
public:
 //函数功能:抽象结账接口
 //参数: const int imonetary[in]-- 消费金额
 //返回值:  无
 virtual void checkoutinterface(const int imonetary) = 0;
};

//普通会员结账策略,具体策略类,继承于抽象策略类
class concreatestrategynormal :public strategy
{
public:
 //函数功能:普通会员结账策略
 //参数: const int imonetary[in]-- 消费金额
 //返回值:  无
 void checkoutinterface(const int imonetary)
 {
  cout << "客户类型:" << "普通会员" << endl;
  cout << "结算金额:" << imonetary*0.95 << endl;
 }
};

//银牌会员结账策略,具体策略类,继承于抽象策略类
class concreatestrategysilver :public strategy
{
public:
 //函数功能:银牌会员结账策略
 //参数: const int imonetary[in]-- 消费金额
 //返回值:  无
 void checkoutinterface(const int imonetary)
 {
  cout << "客户类型:" << "银牌会员" << endl;
  cout << "结算金额:" << imonetary*0.8 << endl;
 }
};

//金牌会员结账策略,具体策略类,继承于抽象策略类
class concreatestrategygold :public strategy
{
public:
 //函数功能:金牌会员结账策略
 //参数: const int imonetary[in]-- 消费金额
 //返回值:  无
 void checkoutinterface(const int imonetary)
 {
  cout << "客户类型:" << "金牌会员" << endl;
  cout << "结算金额:" << imonetary*0.6 << endl;
 }
};

//context类,上下文类,用一个具体策略来配置,实现不同策略的调用
class context
{
public:
 //函数功能:构造函数
 //参数: strategy* pstrategy[in]-- 具体策略
 //返回值:  无
 context(strategy* pstrategy)
 {
  this->m_pstrategy = pstrategy;
 }

 //函数功能:析构函数,释放指针
 //参数: 无
 //返回值:  无
 ~context()
 {
  if (this->m_pstrategy != null)
  {
delete this->m_pstrategy;
this->m_pstrategy = null;
  }
 }

 //函数功能:上下文接口,用于调用策略
 //参数: 无
 //返回值:  无
 void contextinterface(const int imonetary)
 {
  if (this->m_pstrategy != null)
  {
this->m_pstrategy->checkoutinterface(imonetary);
  }
 }

private:
 strategy* m_pstrategy; //具体策略的指针
};

int main()
{
 int imonetary = 200;

 //普通会员结算
 cout << "顾客a消费金额:" << imonetary << endl;
 context* pcontextnormal = new context(new concreatestrategynormal());
 if (pcontextnormal != null)
 {
  pcontextnormal->contextinterface(imonetary);

  delete pcontextnormal;
  pcontextnormal = null;
 }

 cout << "*******************************************" << endl;
 //银牌会员结算
 cout << "顾客b消费金额:" << imonetary << endl;
 context* pcontextsilver = new context(new concreatestrategysilver());
 if (pcontextsilver != null)
 {
  pcontextsilver->contextinterface(imonetary);

  delete pcontextsilver;
  pcontextsilver = null;
 }

 cout << "*******************************************" << endl;
 //金牌会员结算
 cout << "顾客c消费金额:" << imonetary << endl;
 context* pcontextgold = new context(new concreatestrategygold());
 if (pcontextgold != null)
 {
  pcontextgold->contextinterface(imonetary);

  delete pcontextgold;
  pcontextgold = null;
 }

 getchar();
 return 0;
}

输出结果

设计模式学习之C++实现的策略模式实例讲解