Tag: 状态

用状态/策略模式替换if / else逻辑

我已经阅读过以前的堆栈交换,用Java替换条件逻辑,例如带有状态/策略模式的IF / ELSE,但我不确定我的案例是否适合替换。 以下是我看到的结果 – Java中的if语句的长列表以及将许多’if else’语句转换为更干净的方法 我本质上是在编写一个文件下载管理器,这些是我的IF / ELSE结构: 如果文件及其zip文件存在,则将zip文件移动到zip文件目录并读入文件 如果zip文件存在,则解压缩文件并将zip文件移动到zip文件目录并读入文件 如果zip文件不存在,则从指定的URL下载,然后解压缩并读入文件并将zip文件移动到指定的目录。 如果URL中不存在zip文件,则创建空白文件并将其写入磁盘。 基本上我理解你将这四个条件作为哈希映射中的键,然后值是需要发出的“命令”。 但是我相信你仍然需要一个If / Else来决定在作为输入给出的键上调用什么动作。 所以我没有看到好处。 有人可以解释一下吗?

如何从多个类扩展状态

(请注意:交易卡游戏Magic:The Gathering的知识将在这里加分。抱歉,我不知道如何更容易。) 我遇到了一个使用Java的问题,我将描述如下……我有一个名为Card的基本类,它具有以下所有属性: public class Card{ String Name; String RulesText; String FlavorText; String Cost; int ConvertedCost; String Rarity; int Number; } 永久类扩展卡,并由生物,飞行者,神器,土地和结界等类扩展。 到目前为止,只有前两个有自己的领域: public class Creature extends Permanent{ int Power; int Toughness; } public class Planeswalker extends Permanent{ int Loyalty; } 问题: 某些永久对象可能受影响其子类对象的方法的影响,例如,作为工件和生物,或作为工件和土地。 我知道我可以使用接口来扩展行为,但除非我使用抽象类,否则我不能这样做以扩展状态,在某些情况下我需要一个具有Artifacts和Creatures状态的对象。 指定子类的大多数永久对象不会受到针对不同子类的对象的方法的影响 。 (即,仅针对Enchantment对象的方法不能影响Creature对象。)

使用状态模式设计在Java中实现通信协议

如果在别处得到回答,请道歉; 找不到足够的信息来说服自己最好的方法来做到这一点。 我也意识到这是一个冗长的解释,没有代码,但请告诉我是否应该提供一些示例代码来帮助演示我正在做的事情。 基本上: 使用System.in/out在Java中实现通信协议 当前方法正在实现一种状态模式,其中Scanner在上下文类中的System.in上实例化 具体状态调用上下文方法从扫描程序读取,然后根据扫描程序返回的值适当地执行操作/转换状态 我最初使用状态模式的意图是在从System.in解析这样的序列时简化代码(不要问语法,这是我必须使用的东西): 命令名称= X. HEADER 标题信息行 内容 命令行内容 ENDCONTENTS ENDCOMMAND 我通常为我期望接收的每种命令定义一个具体的状态。 以上面的序列为例,我的状态集看起来像{WAITING_FOR_COMMAND,COM​​MAND_RECEIVED,PARSING_HEADER,PARSING_CONTENTS,PARSING_DONE,COMMAND_PROCESSED}。 我最初在WAITING_FOR_COMMAND,然后当收到“COMMAND NAME = X”时我转换到COMMAND_RECEIVED,然后当“HEADER”进入时我会转换到PARSING_HEADER等等。这个设计使遍历所有边缘情况协议变得更容易,并且在协议被调整时也使代码易于更新/维护。 显然比大规模切换语句和重复边界检查要好得多。 我遇到的问题是,我发现自己在上下文类中声明了越来越多的状态变量,因为我充实了我的具体状态行为,并且知道这可能很糟糕,因为我正在创建非常暴露的接口和非常高的联系上下文和具体的状态类。 该协议中的命令序列可以任意长,并且我需要保存命令序列中每个项所赋予的信息,直到命令序列完成。 以上面的命令序列为例,在“COMMAND ID = X”之后,我希望在收到“ENDCOMMAND”后保存值X以备将来使用并完全处理命令。 在“HEADER”之后,我希望保存标题信息,以便在我实际处理命令时收到“ENDCOMMAND”后将来使用。 等等等等。 简单地将commandId和头状态变量添加到上下文类现在可以工作,但看起来并不干净或完全封装在我身上。 有没有人对他们如何解决这个问题有任何高层建议? 为此更好地使用状态设计模式吗? 只是要注意我一直在玩的一些想法: 为每种类型的命令序列定义状态上下文,并在从System.in接收相关命令时调用适当的上下文; 这看起来几乎像拥有巨大的开关块一样凌乱,似乎过度curl了设计 设计一个支持复合FSM的全面FSM架构,其中每个命令序列在一个总体FSM中占用自己的FSM; 这对我来说似乎有些过分 为每个命令序列类型创建一个具有各种子类的ProtocolCommand对象; 我可以在转换时将它们传递到每个状态,然后逐渐构建它们……但是这会使状态界面变得混乱并强制所有状态摄取它们不一定会使用的参数 非常感谢! 对不起,这太冗长了,如果我能说清楚的话,请告诉我。