在行为类设计模式中,状态模式和策略模式是亲兄弟,两者非常相似,两个类图非常相似,都是通过Context类封装一个具体的行为,都提供了一个封装的方法,是高扩展性的设计模式。

但根据两者的定义,我们发现两者的区别还是很明显的:策略模式封装的是不同的算法,算法之间没有交互,以达到算法可以自由切换的目的;而状态模式封装的是不同的状态,以达到状态切换行为随之发生改变的目的。这两种模式虽然都有变换的行为,但是两者的目标却是不同的。

从关注焦点区分

策略模式关注的焦点在于具体的某一个行为,准确的说是某一行为的具体执行过程。一般来说,即使拥有多种不同的执行过程,但是执行的结果是相同的。就比如拿到一串数字进行排序,排序是一个行为,可以理解为类中的一个方法,这个方法是抽象的。而不同的排序算法就是对排序行为的不同实现。不同的排序算法所耗费的内存空间和时间都不相同,但是最终的排序结果都是相同的。这应该是策略模式的典型应用场景。

状态模式关注的焦点在于内部状态的改变而引起的行为的变化。即在不同的状体下,某一个行为的执行是不尽相同的。不仅是行为过程不同,甚至是结果也会改变。比如在一个电商网站的某个商品页面,点击购买。如果用户是已登录状态,那么就会跳转至订单结算页面;但如果是未登录状态,就会跳转到登录页面要求用户先登录。

从外部干涉区分

从干涉方式来看,策略模式中具体行为策略的改变是由调用方主动指定的,除此之外,没有其他因素会让具体的执行策略发生改变。也就是对于某一个 context 对象而言,只有一个最合适的策略对象。也就是当我们指定了某个具体的排序算法后,如果不主动重新指定,那么以后就会一直使用该算法进行排序,不会发生改变。context 内部策略的改变对于调用方是透明的,因为策略的改变是由调用方发起的。

而状态模式中状态对象的改变是不需要调用方主动干涉的,根据 context 对象相关属性的变化,就会引起 context 内部 state 对象的变化。而与状态相关的方法都依赖于具体的状态对象。并且在执行了相关方法后,状态会自动发生改变。而这些状态的改变对于调用方是隐藏的,调用只是想调用某个方法,但是这个方法在不同状态的执行结果,调用方是无法预测的。就好像上面商城的案例中,当你点击购买按钮的时候,你并不知道是否一定会跳转到订单结算付款页面。

总结

可以说,策略模式封装的是行为,而状态模式封装的是变化。尽管这么说,但事实上策略模式与状态模式在很多情况下都是可以互相转化的,具体应该使用何种模式,就要从上面的两个方面尽心分析,能够看得出明显状态变化的,当热要用状态模式;如果只是选择一个合适的具体执行方案,那么显然策略模式更为适合,毕竟状态模式由于牵涉到状态的变化和转移方向,是要比策略模式略微复杂的,这里的复杂并不是指代码难以理解,而是从设计模式的角度来说明类的结构。

【设计模式】策略模式VS状态模式相关推荐

  1. 【设计模式】 模式PK:策略模式VS状态模式

    1.概述 行为类设计模式中,状态模式和策略模式是亲兄弟,两者非常相似,我们先看看两者的通用类图,把两者放在一起比较一下. 策略模式(左)和状态模式(右)的通用类图. 两个类图非常相似,都是通过Cont ...

  2. Java设计模式之策略模式与状态模式

    一.策略模式定义 定义:策略模式定义了一系列的算法,并将每一个算法封装起来,而且使他们之间可以相互替换,策略模式可以在不影响客户端的情况下发生变化. 好了,定义看看就完了,我知道你很烦看定义. 二.策 ...

  3. 【设计模式系列19】状态模式原理分析及其和策略模式,责任链模式的区别

    状态模式原理分析 设计模式系列总览 前言 什么是状态模式 状态模式示例 状态模式角色 状态模式与责任链模式 状态模式与策略模式 状态模式应用场景 状态模式优缺点 总结 设计模式系列总览 设计模式 飞机 ...

  4. 设计模式之模板方法模式、策略模式、命令模式、责任链模式、状态模式

    前言 本章节给您介绍23种设计模式的行为型模式中的模板方法模式.策略模式.命令模式.责任链模式.状态模式. 如有帮助记得3连 加 关注哦!欢迎品论去留言交流,谢谢阅读! 文章目录 前言 一.模板方法模 ...

  5. java输出不同颜色_Java设计模式-策略模式、状态模式

    推荐阅读: 一只Tom猫:都是"Redis惹的祸",害我差点挂在美团三面,真是"虚惊一场"! java喵:6大面试技能树:JAVA基础+JVM+算法+数据库+计 ...

  6. 对策略模式与状态模式的一点思考

    在以前的一片博文里 http://www.cnblogs.com/mightofcode/archive/2012/11/19/2771216.html,我发表了我对设计模式的一点看法 但是今天的一个 ...

  7. 策略模式 VS 状态模式

    在行为类设计模式中,状态模式和策略模式是亲兄弟,两者非常相似,两个类图非常相似,都是通过Context类封装一个具体的行为,都提供了一个封装的方法,是高扩展性的设计模式. 但根据两者的定义,我们发现两 ...

  8. java - 策略模式、状态模式、卫语句,避免多重if-else(转)

    前言 当代码中出现多重if-else语句或者switch语句时.弊端之一:如果这样的代码出现在多处,那么一旦出现需求变更,就需要把所有地方的if-else或者switch代码进行更改,要是遗漏了某一处 ...

  9. 《大话》之 策略模式 Vs 状态模式

    一.简介: 策略模式: 背景:商店要打折销售,各种版本的销售方式,让小菜心烦意乱 内容:    定义算法家族,分别封装起来,让他们之间可以户型替换,此模式让算法的变化,不会影响到使用算法的用户. 图文 ...

最新文章

  1. java 打包的两种方式
  2. Linux查看ip的命令详解
  3. 使用gdb调试多进程程序、同时调试父进程和子进程
  4. windows 7 与linux 双系统 安装
  5. python计算工资_python学习之工资结算
  6. FreeCAD 导出STL格式文件格式
  7. 实验1构建多连杆机器人模型
  8. 小程序 获取地理位置
  9. Androd 基本布局(其一)
  10. 郑州中小幼计算机初中级,郑州市中小幼计算机等级考试大纲.doc
  11. Frenet坐标系与Cartesian坐标系互转(三):应用示例
  12. Compact Multi-Signatures for Smaller Blockchains代码解析
  13. 【wireshark、MISC】将pcapng文件转为pcap文件,再用NetworkMiner分析流量包
  14. Xsolla对话成都游戏茶馆CEO
  15. [论文笔记] Detection of Glottal Closure Instants from Speech Signals: CNN Method
  16. 微信小程序picker地区选择器显示省市二级联动
  17. 关于节日文化的HTML网页设计-----二十四节气
  18. 字模显示字符串C语言,[求助]关于点阵字模显示
  19. 高中数学基础-2.1.1(1)根式的运算
  20. 如何判断一个数据是NaN

热门文章

  1. BZOJ4826: [Hnoi2017]影魔
  2. 那些年和我一起睡的男人
  3. 设置防火墙规则,实现远程桌面连接的限制
  4. 两台电脑通过交叉网线连接一台做为服务器一台做为客户端的配置方法
  5. 《音乐达人秀:Adobe Audition实战200例》——实例2 用麦克风录制清唱歌声
  6. 模仿CSDN浏览器右下角弹出广告,兼容所有浏览器,内容可自定义,扩张性强
  7. 分享个好用的拼图神器
  8. MacOs15.2 Catalina安装
  9. qW3xT.6解决挖矿病毒 - 云服务器被植入挖矿脚本成为矿机
  10. u盘启动linux3.0,5分钟打造U盘启动的Ubuntu (3篇)