• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    公众号

策略模式【C++版】

原作者: [db:作者] 来自: [db:来源] 收藏 邀请

一、 基本特点:

        a)根据不同的情况,创建不同的对象

        b)每个对象方法名相同,方法的实现差别很大


二、组成:

       a)抽象策略: 1个
       b)具体策略  多个,封装了相关的算法和行为
       c)调度类: 持有一个具体策略类的引用,供客户端使用


三、代码实现:

#include<iostream>
using namespace std;
/*************************************策略基类****************************************/

class StrategyBase//主要定义了虚函数
{
public:
virtual void multiWay_tour()=0;//说明是纯虚函数(没有实现的虚函数),必须如此声明
};

/*************************************具体策略类****************************************/

class StrategyFirstChild:public StrategyBase//策略子类,主要对父类定义的虚方法进行具体实现
{
public:
void multiWay_tour()
{
cout
<<"I'll go tourism on feet"<<endl;
}
};

class StrategySecondChild:public StrategyBase//策略子类,主要对父类定义的虚方法进行具体实现
{
public:
void multiWay_tour()
{
cout
<<"I'll go tourism by train"<<endl;
}
};

/*************************************调度类****************************************/

class Context //调度类,根据传进来的参数,选择具体某个策略----待优化<参考教程>
{
private:
StrategyBase
*strategyChild;

public:
Context(StrategyBase
*child)
{
strategyChild
=child;
}
void multiWay_tour()
{
strategyChild
->multiWay_tour();
}

};

/*************************************客户端****************************************/
int main()
{
cout
<<"测试程序"<<endl;

//“具体策略类”只在定义多个“调度类”时使用
Context *Context_A=new Context(new StrategyFirstChild()),
*Context_B=new Context(new StrategySecondChild()),
*Context_C=new Context(new StrategySecondChild());

//调用方法,只通过“调度类”实现,算法之间的差异已被屏蔽
Context_A->multiWay_tour();
Context_B
->multiWay_tour();
Context_C
->multiWay_tour();

cout
<<endl;
system(
"pause");
return 0;
}

 运行结果:

 

四、策略模式与简单工厂模式对比:

   简单工厂模式:根据不同的情况,创建不同的对象,对象之间类型差别较大,

         有可能各个类的方法名和个数差别很大

                         注重不同对象的创建:根据不同的情况创建不同的对象(eg:下单,查资金等)

   策略模式根据不同的情况,创建不同的对象.对象不同类型相近,方法差别大. 尤其适合经

         常变动的多种不同算法。 一般用于多个类的方法名都相同,但是实现方式不同

                         注重多个对象的相同行为屏蔽方法名相同,算法实现细节不同之间的差异

                                  (eg:txt、xml、dat、access四种格式的数据操作,读取,删除,修改) 


                


鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
上一篇:
C#TextBox单个键入字符进行16进制验证发布时间:2022-07-13
下一篇:
C#获取汉字的全拼发布时间:2022-07-13
热门推荐
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap