• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号
您的位置:首页 > 程序设计 >C语言 > 深入解析C++编程中对设计模式中的策略模式的运用

深入解析C++编程中对设计模式中的策略模式的运用

作者:十八道胡同 字体:[增加 减小] 来源:互联网 时间:2017-05-28

十八道胡同 通过本文主要向大家介绍了设计模式c++,c++单例模式,c++设计模式pdf,大话设计模式c++,c++工厂模式等相关知识,希望对您有所帮助,也希望大家支持linkedu.com www.linkedu.com

策略模式也是一种非常常用的设计模式,而且也不复杂。下面我们就来看看这种模式。
定义:策略模式定义了一系列的算法,并将每一个算法封装起来,而且使它们还可以相互替换。策略模式让算法独立于使用它的客户而独立变化。

角色:

  •     抽象策略角色(Strategy): 抽象策略类。
  •     具体策略角色(ConcreteStrategy):封装了继续相关的算法和行为。
  •     环境角色(Context):持有一个策略类的引用,最终给客户端调用。

UML图:

201639105036032.jpg (548×222)

例子:

#include <iostream> 
using namespace std; 
 
class WeaponBehavior 
{ 
public: 
  void virtual useWeapon() = 0; 
}; 
 
class AK47:public WeaponBehavior 
{ 
public: 
  void useWeapon() 
  { 
    cout << "Use AK47 to shoot!" << endl; 
  } 
}; 
 
class Knife:public WeaponBehavior 
{ 
public: 
  void useWeapon() 
  { 
    cout << "Use Knife to kill!" << endl; 
  } 
}; 
 
class Character 
{ 
public: 
  Character() 
  { 
    weapon = 0; 
  } 
  void setWeapon(WeaponBehavior *w) 
  { 
    this->weapon = w; 
  } 
  void virtual fight() = 0; 
protected: 
  WeaponBehavior *weapon; 
}; 
 
class King:public Character 
{ 
public: 
  void fight() 
  { 
    cout << "The king:" ; 
    if ( this->weapon == NULL) 
    { 
      cout << "You don't have a weapon! Please Set Weapon!" << endl; 
    } 
    else 
    {  
      weapon->useWeapon(); 
    } 
  } 
}; 
int main() 
{   
  WeaponBehavior *ak47 = new AK47(); 
  WeaponBehavior *knife = new Knife();    
 
  Character *kin = new King();    
 
  kin->fight();   
  cout << endl;  
 
  kin->setWeapon(ak47); 
  kin->fight(); 
  cout << endl; 
 
  kin->setWeapon(knife); 
  kin->fight(); 
 
  return 0; 
} 
</div>

适用性:
1,多个类只区别在表现行为不同,可以使用Strategy模式,在运行时动态选择具体要执行的行为。
2,需要在不同情况下使用不同的策略(算法),或者策略还可能在未来用其它方式来实现。
3,对客户隐藏具体策略(算法)的实现细节,彼此完全独立。

优缺点:
优点:
1,策略模式提供了管理相关的算法族的办法。策略类的等级结构定义了一个算法或行为族。恰当使用继承可以把公共的代码移到父类里面,从而避免代码重复。
2,使用策略模式可以避免使用多重条件(if-else)语句。多重条件语句不易维护,它把采取哪一种算法或采取哪一种行为的逻辑与算法或行为的逻辑混合在一起,统统列在一个多重条件语句里面,比使用继承的办法还要原始和落后。
缺点:
1,客户端必须知道所有的策略类,并自行决定使用哪一个策略类。这就意味着客户端必须理解这些算法的区别,以便适时选择恰当的算法类。换言之,策略模式只适用于客户端知道算法或行为的情况。
2,由于策略模式把每个具体的策略实现都单独封装成为类,如果备选的策略很多的话,那么对象的数目就会很可观。

和其他设计模式的区别:
1,与状态模式
在解决的问题上,状态模式是解决内在状态的改变,而策略模式是解决内部算法的改变。在解决的方法上,状态模式是自我控制状态的改变,而策略模式是由外部制定使用使用啥策略。
2,简单工厂模式
简单工厂模式是创建型模式,关注对象的创建。策略模式是行为型模式,关注行为的封装。简单工厂模式是根据不同的条件返回一个适合的类给你使用,然后调用者使用工厂类返回的类去完成相应的操作。而策略模式是必须首先创建一个想使用的类实例,然后实例被当作参数传递进去,既而通过该实例去调用不用的算法。在简单工厂模式中实现了通过条件选取一个类去实例化对象,策略模式则将选取相应对象的工作交给模式的使用者,它本身不去做选取工作。

</div>
分享到:QQ空间新浪微博腾讯微博微信百度贴吧QQ好友复制网址打印

您可能想查找下面的文章:

  • 深入理解C++之策略模式
  • C++设计模式编程中简单工厂与工厂方法模式的实例对比
  • 解析C++编程中如何使用设计模式中的状态模式结构
  • 详解C++设计模式编程中对访问者模式的运用
  • C++设计模式编程之Flyweight享元模式结构详解
  • 详解C++设计模式编程中责任链模式的应用
  • 深入剖析设计模式中的组合模式应用及在C++中的实现
  • 设计模式中的备忘录模式解析及相关C++实例应用
  • 深入解析设计模式中的适配器模式在C++中的运用
  • 全面解析设计模式中的建造者模式及相关C++实现

相关文章

  • 2017-05-28C 语言条件运算符详细讲解
  • 2017-05-28简单总结C++中指针常量与常量指针的区别
  • 2017-05-28C++编程中用put输出单个字符和cin输入流的用法
  • 2017-05-28详谈全排列next_permutation() 函数的用法(推荐)
  • 2017-05-28VC++进度条process Bar的用法实例
  • 2017-05-28C++之普通成员函数、虚函数以及纯虚函数的区别与用法要点
  • 2017-05-28strcpy函数实现简示例命分享
  • 2017-05-28C语言编写基于TCP和UDP协议的Socket通信程序示例
  • 2017-05-28常用Hash算法(C语言的简单实现)
  • 2017-05-28C++ 中dynamic_cast&lt;&gt;的使用方法小结

文章分类

  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号

最近更新的内容

    • Linux网络编程之UDP Socket程序示例
    • c语言实现字符串中单词的反转
    • VC++实现文件与应用程序关联的方法(注册表修改)
    • C语言控制台版2048小游戏
    • C语言rewind和fseek函数的用法详解(随机读写文件)
    • C++使用递归和非递归算法实现的二叉树叶子节点个数计算方法
    • C++中函数重载实例详解
    • C 语言指针概念的详解
    • C++使用WideCharToMultiByte函数生成UTF-8编码文件的方法
    • C++日志记录类实例解析

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有