java状态模式和策略模式_Java状态和策略设计模式之间的差异

java状态模式和策略模式

为了在Core Java应用程序中正确使用状态和策略设计模式,对于Java开发人员清楚地了解它们之间的区别很重要。 尽管状态和策略设计模式的结构相似,并且都基于开放式封闭设计原则,从SOLID设计原则表示为“ O”,但它们在意图上却完全不同。 Java中的策略设计模式用于封装相关的算法集,以为客户端提供运行时灵活性。 客户端可以在运行时选择任何算法,而无需更改使用Strategy对象的Context类。 策略模式的一些流行示例是编写代码,该代码使用诸如加密,压缩或排序算法之类的算法。

另一方面,状态设计模式允许对象在不同状态下表现不同。 由于现实世界中的对象通常具有状态,并且它们在不同状态下的行为也有所不同,例如,自动售货机仅在处于hasCoin状态时才出售物品,因此只有在您将硬币放在硬币上后,它才会出售。 现在您可以清楚地看到策略和状态模式之间区别 ,这里的意图是不同的。 状态模式有助于对象管理状态,而策略模式则允许客户选择不同的行为。 另一个不容易看到的差异是,谁推动了行为的改变。 在使用策略模式的情况下,它是为上下文提供不同策略的客户端,在状态模式上,状态转换由上下文或状态本身管理。 此外,如果要在State对象本身中管理状态转换,则它必须保存Context的引用,例如自动售货机,以便它可以调用setState()方法来更改Context的当前状态。 另一方面,Strategy对象从不持有Context的引用,而是将选择的Strategy传递给Context的客户端。 由于状态和策略模式之间的差异是Interviews上流行的Java设计模式问题之一 ,因此在这篇Java设计模式文章中,我们将对此进行更仔细的研究。 我们将探讨Java中的策略和状态设计模式之间的相似点和不同点,这将有助于增进您对这两种模式的理解。

如果查看状态和策略设计模式的UML图,它们看起来彼此非常相似。 使用State对象更改其行为的对象称为Context对象,类似地,使用Strategy对象更改其行为的对象也称为Context对象。 记住客户端与Context对象进行交互。 在状态模式的情况下,上下文将方法调用委托给以当前对象形式保存的状态对象,而在策略模式的情况下,上下文使用作为参数传递或在创建Context对象时提供的Strategy对象。

Java状态模式的UML图

状态设计模式

此UML图是用于状态设计模式的,用于解决用Java创建自动售货机的面向对象设计的经典问题。 您可以看到自动售货机状态使用一个接口表示,该接口还具有实现以表示具体状态的实现。 每个状态还持有Context对象的引用,以由于Context触发的动作而转换到另一个状态。

Java策略模式的UML图

Java策略设计模式
此UML图用于策略设计模式,实现排序功能。 由于排序算法很多,这种设计模式使客户可以在对对象进行排序时选择算法。 实际上,Java Collection框架利用此模式来实现
Collections.sort()方法,用于对Java中的对象进行排序。 唯一的区别是不是允许客户选择排序算法,而是允许他们通过在Java中传递Comparator或Comparable接口的实例来指定比较策略。

让我们看看这两个核心Java设计模式之间的更多相似之处:

  1. 状态和策略模式都可以轻松添加新的状态和策略,而不会影响使用它们的Context对象。
  2. 两者都使您的代码遵循开放式封闭设计原则 ,即您的设计将开放以进行扩展而封闭以进行修改。 在状态和策略模式的情况下,将关闭Context对象以进行修改,引入新的State或新的Strategy,或者您不需要修改其他状态的Context,或者只需要进行最小的更改。
  3. 就像Context对象以State design Pattern中的初始状态启动一样,对于Java中的Strategy 模式 ,Context对象也具有默认策略。
  4. 状态模式以不同状态对象的形式包装不同的行为,而策略模式以不同策略对象的形式包装不同的行为。
  5. 策略和状态模式都依赖于子类来实现行为。 每个具体策略都从抽象策略扩展而来,每个状态都是用于表示状态的接口子类或抽象类 。

因此,现在我们知道国家和战略在结构上相似,意图也不同。 让我们回顾一下这些设计模式之间的一些关键区别。

  1. 策略模式封装了一组相关的算法,并允许客户端在运行时通过组合和委派来使用可互换的行为。另一方面,状态模式可帮助类在不同的状态下表现出不同的行为。
  2. 状态和策略彭定康之间的另一个区别是,状态封装对象的状态,而策略模式封装算法或策略。 由于状态与对象紧密地关联在一起,因此无法重用,但是通过将策略或算法与其上下文分离,我们可以使它们可重用。
  3. 在状态模式中,单个状态可以包含Context的引用以实现状态转换,但是Strategies不包含使用Context的引用。
  4. 可以将策略实现作为参数传递到使用它们的对象,例如Collections.sort()接受Comparator ,这是一个策略。 另一方面,状态是上下文对象本身的一部分,并且随着时间的流逝,上下文对象从一个状态转换到另一个状态。
  5. 尽管“策略”和“状态”均遵循“开放式封闭设计”原则,但“策略”也遵循“单一职责”原则。由于每个策略都封装了单独的算法,因此不同的策略彼此独立。 一个策略的更改不会命令另一个策略的更改。
  6. 策略和状态模式之间的另一个理论差异是,前者定义对象的“如何”部分,例如排序对象如何对数据进行排序,另一方面,状态模式定义对象的“什么”和“何时”部分,例如对象可以做什么? ,当它处于特定状态时。
  7. 国家过渡的顺序在国家模式中得到很好的定义,对战略模式没有这种要求。 客户可以自由选择自己选择的任何策略实施。
  8. 策略模式的一些常见示例是封装算法,例如排序算法,加密算法或压缩算法。 如果看到的话,您的代码需要使用其他种类的相关算法,而不是使用策略模式。 另一方面,识别状态设计模式的使用非常容易,如果您需要管理状态和状态转换,而无需大量嵌套的条件语句,则使用状态模式是一种模式。
  9. 最后,状态和策略模式之间最重要的区别之一是,策略的更改由客户完成,而状态的更改则可以由上下文或状态对象本身完成。

这全是Java状态和策略模式之间的差异 。 就像我说的那样,它们在类图和UML图中看起来都很相似,它们都强制执行Open Closed设计原则并封装了行为。 使用策略设计模式来封装在运行时提供给Context的算法或策略,它可以作为参数或组合对象,并可以使用状态模式来管理Java中的状态转换。

翻译自: https://www.javacodegeeks.com/2014/04/difference-between-state-and-strategy-design-pattern-in-java.html

java状态模式和策略模式

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/341399.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

正斜杠/和反斜杠\的区别

近来研究源码时发现,常常在路径中出现正斜杠“/”和反斜杠“\”,之前就一直不胜其扰,所幸查资料把它一次弄懂,求个明白。在这里做个记录。 我认真搜了一下,发现问这个问题的人还不少,知乎上也有提问的。来…

如何将Java对象转换为JSON字符串

当学习如何编写基于Java的软件时,开发人员遇到的第一个障碍就是如何将其代码与其他软件连接。 这通常是JSON的来源。尽管您可能是Java向导,但JSON是另一种动物。 无论如何,这篇博客文章解释了完成工作所需的一切。 Java对象是数据和处理可用…

C++迭代器(Iterator)详解

迭代器(Iterator)的介绍 背景: 指针可以用来遍历存储空间连续的数据结构,但是对于存储空间费连续的,就需要寻找一个行为类似指针的类,来对非数组的数据结构进行遍历。定义:迭代器是一种检查容器…

Java中的责任链设计模式

在本教程中,我们将学习如何在Java中实现责任链模式。 “责任链”设计模式涉及到拥有一系列负责处理请求的对象链。 当客户端发送请求时,第一个处理程序将尝试处理该请求。 如果可以处理,则请求处理在此结束。 但是,如果处理程序无…

硒测试可实现有效的测试自动化

尽管移动应用程序的市场份额有大幅增长,但网络应用程序仍然以大量的用户群为主导。 在部署之前,企业正在快速关注Web应用程序的质量。 这是测试发挥重要作用的地方。 与某些可以自动化的功能测试不同,UI测试仍然主要是手动过程。 但是将测试自…

C++ map用法总结(整理)

1,map简介 map是STL的一个关联容器,它提供一对一的hash。 第一个可以称为关键字(key),每个关键字只能在map中出现一次;第二个可能称为该关键字的值(value); map以模板(泛型)方式实现,可以存储任意类型的…

带有Spring Cloud Config和JHipster的Java微服务

朋友不允许朋友写用户身份验证。 厌倦了管理自己的用户? 立即尝试Okta的API和Java SDK。 在几分钟之内即可对任何应用程序中的用户进行身份验证,管理和保护。 如今,使用Java和Spring Boot开发微服务架构非常流行。 它绝对是Java生态系统中最…

如何在Java中使用Lombok删除样板安装程序获取器

你好朋友, 一次又一次反对Java的观点之一是,我们必须写很多样板 我们简单的POJO类的setter和getter形式的代码,不必要地增加了 我们代码的长度。 为了解决这个问题,有一个名为Project Lombok的开源项目可以解决这个问题。 通过…

Dev-C++使用技巧1(亲测)(超详细)(安装过程、修改语言、新建项目、配置C++ 11、开启警告信息和调试信息)

前言 Dev-C是一款内存占用小,支持C/C,支持调试,可以一键编译、运行的IDE(集成开发环境)。 下载链接:Dev-C - Download 如果上面那个不行或者下载比较慢,可以点链接: Dev-Cpp 提取码: xaby 。 …

从网络虚拟化,看智能网卡发展史

5G的到来无疑将加速网络虚拟化的进程,在电信领域,网络虚拟化不仅在核心网,也在网络的边缘。但是,仅仅通过软件解决方案不能提供足够的网络可靠性和服务质量,而具有高级可编程功能智能网卡(Smart NIC&#x…

Dev-C++使用技巧2(亲测)(更改字体和颜色、自动保存、快捷键选项、一键排版)

更改字体和颜色 顶部菜单栏->工具->编辑器选项。 更改字体 当前选项卡->显示,字体word有的基本都有,华文楷体、宋体,幼圆之类。西文字体默认字体Consloas就不错,中文的话幼圆、新宋体都挺不错。 幼圆效果&#xff1…

深入浅出全面解析RDMA

RDMA(RemoteDirect Memory Access)技术全称远程直接内存访问,就是为了解决网络传输中客户端与服务器端数据处理的延迟而产生的。它将数据直接从一台计算机的内存传输到另一台计算机,无需双方操作系统的介入。这允许高吞吐、低延迟的网络通信,…

hypervisor介绍

hypervisor:一种运行在物理服务器和操作系统之间的中间层软件,可以允许多个操作系统和应用共享一套基础物理硬件。可以将hypervisor看做是虚拟环境中的“元”操作系统,可以协调访问服务器上的所有物理设备和虚拟机,所以又称为虚拟…

Selenium WebDriver中的TestNG侦听器及示例

Java提供了不同的接口,使您可以修改TestNG行为。 这些接口在Selenium WebDriver中进一步称为TestNG侦听器。 TestNG Listeners还允许您根据项目要求自定义测试日志或报告。 Selenium WebDriver中的TestNG侦听器是侦听某些事件并跟踪测试执行情况的模块,…

Ubantu键盘快捷键

Ubuntu系统 长按"Win"键可打开快捷键提示界面

win10安装python详细过程

关于python的安装 一切语言皆为工具接下来咱们就开始吧一切语言皆为工具 既然你决定安装它,那就已经告知自己要掌握这门工具, 但是有一定你一定要铭记于心那就是: python 是个工具时刻想着如何用它解决你的问题【哪怕是一个简单的想法】 接…

第18次csp认证 201912-1 报数(C++)

题目 分析 需要跳过的包括:7的倍数和包括7的数。跳过的同时n要加一(总的报n个数,跳过的不算)。声明一个全局数组count[4]方法1:i1开始到n,把输入的i转化为字符串,然后在字符串里找’7’或者7的…

C++ vector求均值和方差

1 定义 &#xff08;1&#xff09;均值 &#xff08;2&#xff09;方差 &#xff08;3&#xff09;标准差 2 代码实现 //std::vector< double> 或者 std::vector< int> 类型变量求均值和方差 #include <numeric> #include <iostream> #include <m…

第18次csp认证 201912-2 回收站选址(C++)

题目 分析 每一个垃圾堆放处都可能是回收站&#xff0c;所以两轮循环&#xff0c;找出所有可以成为回收站的坐标。再两轮循环&#xff0c;确定所有回收站的得分最后输出每种得分的回收站个数 AC代码 #include <iostream> #include<string> using namespace std;…

Python——列表中存放字典遇到的问题

Python——列表中存放字典遇到的问题 使用列表、字典之间的相互嵌套可以很容易的实现json数据格式&#xff0c;但是昨天在往列表中装入字典时遇到了问题&#xff1a; 直接使用append方法将字典添加到列表中&#xff0c;如果需要更改字典中的数据&#xff0c;那么列表中的内容也…