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

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

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

相关文章

【原创】系统分析师--任重而道远

今天查到了系统分析师的成绩。有坏消息,也有好消息。 坏消息当然就是意料之中的没过了,好消息是我基本上没有花什么时间去准备,但是结果却比想象中的要好。 案例分析这一场过了。基础知识差几分,论文只是及格分的一半&#xf…

XML文档的简易增删查改

dom4j解析一、利用dom4j操作元素节点 1.查询第一本书的书名,并输出到控制台 2.给第一本书添加一个特价节点, 并修改第一本书的售价节点的内容为19.8元 3.删除第二本书的作者节点二、利用dom4j操作属性节点 1.给第一本书添加一个属性,如:出版社…

廖雪峰Java3异常处理-1错误处理-2捕获异常

1捕获异常 1.1 finally语句保证有无错误都会执行 try{...}catch (){...}finally{...} 使用try...catch捕获异常可能发生异常的语句放在try{...}中使用catch捕获对应的Exception及其子类1.2 捕获多个异常 try{...} catch() {...} catch(){...}finally{..} 使用多个catch子句&…

更新数据库

方法一:在对SQL数据库进行更新时,用CommandBuilder对像来自动构建sql命令,来起到更新的作用;这种方法用起来比较方便,具体代码如下: 以下代码都在xp系统下测试通过 环境:vs.net2005 \ sql server 2000\xpus…

在崩溃或断电后测试Lucene的索引耐久性

Lucene有用的事务功能之一是索引持久性 ,它可以确保一旦成功调用IndexWriter.commit ,即使操作系统或JVM崩溃或断电,或者您杀死-KILL JVM进程,重启后索引也将保持完整(未损坏),并将反映崩溃前的…

Bash 脚本 set 命令教程

http://www.ruanyifeng.com/blog/2017/11/bash-set.html set命令是 Bash 脚本的重要环节,却常常被忽视,导致脚本的安全性和可维护性出问题。本文介绍它的基本用法,让你可以更安心地使用 Bash 脚本。 一、简介 我们知道,Bash 执行脚…

Jmeter、postman、python 三大主流技术如何操作数据库?

1、前言 只要是做测试工作的,必然会接触到数据库,数据库在工作中的主要应用场景包括但不限于以下: 功能测试中,涉及数据展示功能,需查库校验数据正确及完整性;例如商品搜索功能 自动化测试或性能测试中&a…

[转][HTML]css属性

1、字体属性(type)font-family(使用什么字体)font-style(字体的样式,是否斜体):normal/italic/obliquefont-variant(字体大小写):normal/small-capsfont-weight(字体的粗细):normal/bold/bolder/lithterfont-size(字体的大小)&…

7-OKHttp使用详解,步骤挺详细的,适合初学者使用!

OKHttp使用详解,步骤挺详细的,适合初学者使用! 一,OKHttp介绍 okhttp是一个第三方类库,用于android中请求网络。 这是一个开源项目,是安卓端最火热的轻量级框架,由移动支付Square公司贡献(该公司还贡献了Picasso和Leak…

变量与递归函数

变量与递归函数一、变量 变量分为全局变量和局部变量。 python中全局变量和局部变量的最大区别在于局部变量只能通过函数去访问,而全局变量可以直接访问。 举个例子: name linxu #全局变量 def change_name():namepython #局部变量print(name) …

使用MOXy 2.5.1快速且有点脏的JSON模式生成

因此,这些天我正在为即将推出的Oracle云服务开发新的REST API,因此我需要做的一件事情就是能够为模型中的bean自动生成JSON模式。 我正在使用MOXy从POJO生成JSON,从EclipseLink 2.5.1版本开始,它现在具有从bean模型生成JSON模式的…

手机端input[type=date]的placeholder不起作用

<div class"input clearfix"><label class"fl">起始日期</label><input class"fl text_date" type"date" name"" value"" placeholder"年/月/日" /></div><div cla…

Python中的TCP编程,实现客户端与服务器的聊天(socket)

参考大神blog:自己再写一个 https://blog.csdn.net/qq_31187881/article/details/79067644转载于:https://www.cnblogs.com/studybrother/p/10306903.html

利用ASP.NET向服务器上传文件[转]

文件上传技术是一个很实用的技术&#xff0c;有着很广泛的应用&#xff0c;在ASP.NET自身的前一个版本ASP里实现这个功能&#xff0c;就必须使用第三方的组件或者自己开发组件了&#xff0c;现在&#xff0c;用ASP.NET实现起来就简单得多了&#xff0c;我们不需要使用任何组件就…

JavaSE:如何设置/获取您自己的文件和目录属性

在上一篇文章“确定特定文件系统支持的视图”中 &#xff0c;了解如何询问文件系统存储&#xff0c;并了解特定文件属性视图的可支持性。 简而言之&#xff0c;我们将探索最高级和重要的文件属性视图之一&#xff0c;即用户定义的文件属性视图 。 特别是&#xff0c;在系统之…

java中HashMap详解

HashMap 和 HashSet 是 Java Collection Framework 的两个重要成员&#xff0c;其中 HashMap 是 Map 接口的常用实现类&#xff0c;HashSet 是 Set 接口的常用实现类。虽然 HashMap 和 HashSet 实现的接口规范不同&#xff0c;但它们底层的 Hash 存储机制完全一样&#xff0c;甚…

java代码编写的文本特征提取_Test1 java语言写的特征提取源代码,有搞文字识别的可以下载一看,简单易学 Develop 274万源代码下载- www.pudn.com...

文件名称: Test1下载 收藏√ [5 4 3 2 1 ]开发工具: Java文件大小: 35 KB上传时间: 2015-03-02下载次数: 46提 供 者: 常杰详细说明&#xff1a;java语言写的特征提取源代码&#xff0c;有搞文字识别的可以下载一看&#xff0c;简单易学-Feature extraction of the Java …

Iframe父页面与子页面之间的相互调用

父页面&#xff1a; <!DOCTYPE html> <html> <head><title>parents</title><meta charset"UTF-8"> </head> <body> <div id"default">div内容</div> <iframe src"child.html" i…

c# HashTable (哈希表)

HashTable 哈希表 也是System.Collections集合下的数据结构类 它储存的也是Object类型的对象 但是它在内存中是散列排布的 因为这个特性&#xff0c;非常适合存储大量的数据 在HashTable中一个键只能对应一个值&#xff0c;一个值可以对应多个键&#xff08;多对一&#xff09;…

Winform DataGridView数据绑定问题

DataGridView 绑定的数据源如果是DataTable、DataSet &#xff0c;在绑定后添加删除DataTable中的数据&#xff0c; DataGridView控件中的数据会自动改变&#xff0c;然而绑定的对象若是List<>之类的&#xff0c;修改List<>集合中的数据后&#xff0c;DataGridView…