我已经阅读过以前的堆栈交换,用 Java替换条件逻辑,例如带有状态/策略模式的IF / ELSE,但我不确定我的案例是否适合替换.
我看了一下 – Long list of if statements in Java和 Converting many ‘if else’ statements to a cleaner approach

我本质上是在编写一个文件下载管理器,这些是我的IF / ELSE结构:

>如果文件及其zip文件存在,则将zip文件移动到zip文件目录并读入文件
>如果zip文件存在,则解压缩文件并将zip文件移动到zip文件目录并读入文件
>如果zip文件不存在,则从指定的URL下载
然后解压缩并读入文件并将zip文件移动到指定目录.
>如果URL中不存在zip文件,则创建空白文件并将其写入磁盘.

基本上我理解你将这四个条件作为哈希映射中的键,然后值是需要发出的“命令”.
但是我相信你仍然需要一个If / Else来决定在作为输入给出的键上调用什么动作.所以我没有看到好处.有人可以解释一下吗?

解决方法

我认为你应该使用GoF模式 Chain of responsibility.你应该引入两个接口:1)你将检查正确条件的条件,例如“如果zip文件不存在”并返回布尔结果 – 如果条件满足则返回“true”,否则“else”,2)执行策略,它将运行分配有条件的动作,例如: “从指定的URL下载它然后解压缩并读入文件并将zip文件移动到指定的目录.”因此,第一个界面将回答“何时”,第二个 – “然后”. “条件”实现和“执行策略”实现应该组合成“元组”(或对,条目等).这个“元组”应该按照你所描述的顺序移动到集合中.然后,当您需要处理zip文件时,您将迭代收集,调用条件和检查结果,如果结果为“true”,则调用适当的“执行策略”.此外,条件可以与执行策略结合,并通过两种方法转移到单个接口/实现中.上下文,将描述zip文件的当前状态,可以在条件/执行策略之间传递.
希望这可以帮助.

更新.
代码示例(在Java中).

/**
 * All implementations should check proper condition
 */
interface Condition { 

  /**
   * Check if condition is satisfied
   *
   * @param pathToFile path to target file
   * @return 'true' if condition is satisfied,otherwise 'false'
   */
  boolean isSatisfied(String pathToFile); //i've made an assumption that you'll manipulate file path for checking file
}
...
/**
 * Childs will wrap some portion of code (if you'll use language,that supports lambdas/functors,this interface/implementation can be replaced with lambda/functor)
 */
interface Action {

  /**
   * Execute some portion of code
   *
   * @param pathToFile path to target file
   */ 
  void execute(String pathToFile);
}
...
class ZipFileExistsCondition implements Condition {

  @Override
  public boolean isSatisfied(String pathToFile) {
   ... //check if zip file exists
  }
}
...
class ZipFileDoesNotExists implements Condition {
  @Override
  public boolean isSatisfied(String pathToFile) {
   ... //download zip file and move it to some temp directory
   //if file downloaded ok,than return 'true' otherwise 'false'
  }
}
...
class AlwaysSatisfiedCondition implements Condition {
  @Override
  public boolean isSatisfied(String pathToFile) {
   ... //always returns 'true',to run action assigned with this condition
  }
}
...
Collection<Map.Entry<Condition,Action>> steps = Arrays.asList(
 new AbstractMap.ImmutableEntry<Condition,Action>(new ZipFileExistsCondition(),new Action() { /*move zip file to zip file directory and read in file*/ }),new ZipFileDoesNotExists(),new Action() { /*download it from specified URL and then unzip it and read in file and move zip file to specified directory*/ },new AlwaysSatisfiedCondition(),new Action() { /*create blank file and write it out to disk*/  }
);
...
String pathToFile = ...
...
for(Map.Entry<Condition,Action> step: steps) {
 if(!step.getKey().isSatisfied(pathToFile))
   continue;

 step.getValue().execute(pathToFile); 
}

备注:
1)您可以将’Condition’实现为匿名类,
2)’AlwaysSatisfiedCondition’可以是单身,
3)如果你使用的是Java / Groovy / Scala,你可以使用Guava / Apache Commons的’Predicate’而不是’Condition’,’Function’或’Closure’而不是’Action’.

如果您需要在第一个’满意’条件和适当的操作执行后退出,那么只需在执行动作后放入’break’/’return’.

java – 用状态/策略模式替换if/else逻辑的更多相关文章

  1. xcode – xcrun因zip I / O错误而失败:没有这样的文件或目录zip错误:

    尝试使用xcrun导出存档失败,出现以下错误:解决方法xcrun需要绝对路径.(即/User/you/…

  2. ios – 如何从我的文档目录创建.zip文件?

    我想从我的文档目录创建一个ZIP文件.我也想把它作为电子邮件附件发送.解决方法ZipArchive是一个压缩或解压缩zip文件的Objective-C类,它基于开源代码“MiniZip”.它可用于iPhone应用程序开发,也可用于MacOSX上的cocoa.看到这个:http://code.google.com/p/ziparchive/downloads/list

  3. Swift设计模式之状态模式

    转自Swift设计模式原文Design-Patterns-In-Swift

  4. Swift设计模式之策略模式

    转自Swift设计模式原文Design-Patterns-In-Swift

  5. swift设计模式学习 - 策略模式

    移动端访问不佳,请访问我的个人博客设计模式学习的demo地址,欢迎大家学习交流策略模式策略模式定义了算法家族,分别封装起来,让它们之间可以相互替换,此模式让算法的变化,不会影响到使用算法的客户。

  6. Swift Switch案例“不”

    我也试图避免嵌套的switch语句.注意:我知道我可以使用Swift2进行此操作,但是我现在不能使用Swift2,因为这是生产代码.所以请回答Swift1.2中的解决方案.由于所有模式都按顺序检查,你可以做以下事情:所以一般来说,匹配状态之一不是特定状态的情况可以用两种模式完成:第一种匹配状态,第二个是通配符模式,然后匹配所有其他模式案例.

  7. android – 在SDCard上创建带有一些文件的zip文件

    正如我几天前发布的一个问题,我意识到股票电子邮件应用程序无法发送附件中的多个文件:https://stackoverflow.com/questions/5773006/sending-email-with-multiple-attachement-fail-with-default-email-android-app-but不幸的是,我没有得到答案,所以需要找到一个解决方法.用户必须在列表中选择

  8. android – 在apk中将apk转换为zip可以在clockWorkMod中闪存吗?

    如何将apk转换为可在clockWorkMod中刷新的zip?我尝试过使用ApkInstaller.它没用.继续得到错误;“安装中止”.解决方法您只需将应用程序的.apk扩展名更改为.zip然后将.zip放入SD卡中,看看是否可以使用CWM闪存.我不知道你想要做什么,所以如果你能指定更多的信息会很棒.如果您想要的只是将应用程序安装到手机中,那么您可以按照此tutorial进行操作.

  9. android-emulator – 在Android Studio中安装带有zip文件的Android Emulator

    我无法在我的androidstudio安装中安装模拟器,所以我从工作室复制了这个链接并下载了zip文件……

  10. 从您的Android资产文件夹中的ZIP文件中读取文件

    我正在使用ZipInputStream从位于我的Android资产文件夹的ZIP文件中读取文件:它的工作原理很慢,因为它必须使用getNextEntry()顺序读取它,并且有相当多的文件.如果我将ZIP文件复制到SD卡上,使用ZipFile.getEntry时,阅读速度非常快,但是我没有找到使用ZipFile资源文件的方法!有没有办法以快速方式访问资产文件夹中的ZIP?我认为访问ZIP文件在两个不同的位置将是一个简单的方法来处理这个,但唉...)解决方法这对我有用:

随机推荐

  1. 基于EJB技术的商务预订系统的开发

    用EJB结构开发的应用程序是可伸缩的、事务型的、多用户安全的。总的来说,EJB是一个组件事务监控的标准服务器端的组件模型。基于EJB技术的系统结构模型EJB结构是一个服务端组件结构,是一个层次性结构,其结构模型如图1所示。图2:商务预订系统的构架EntityBean是为了现实世界的对象建造的模型,这些对象通常是数据库的一些持久记录。

  2. Java利用POI实现导入导出Excel表格

    这篇文章主要为大家详细介绍了Java利用POI实现导入导出Excel表格,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

  3. Mybatis分页插件PageHelper手写实现示例

    这篇文章主要为大家介绍了Mybatis分页插件PageHelper手写实现示例,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

  4. (jsp/html)网页上嵌入播放器(常用播放器代码整理)

    网页上嵌入播放器,只要在HTML上添加以上代码就OK了,下面整理了一些常用的播放器代码,总有一款适合你,感兴趣的朋友可以参考下哈,希望对你有所帮助

  5. Java 阻塞队列BlockingQueue详解

    本文详细介绍了BlockingQueue家庭中的所有成员,包括他们各自的功能以及常见使用场景,通过实例代码介绍了Java 阻塞队列BlockingQueue的相关知识,需要的朋友可以参考下

  6. Java异常Exception详细讲解

    异常就是不正常,比如当我们身体出现了异常我们会根据身体情况选择喝开水、吃药、看病、等 异常处理方法。 java异常处理机制是我们java语言使用异常处理机制为程序提供了错误处理的能力,程序出现的错误,程序可以安全的退出,以保证程序正常的运行等

  7. Java Bean 作用域及它的几种类型介绍

    这篇文章主要介绍了Java Bean作用域及它的几种类型介绍,Spring框架作为一个管理Bean的IoC容器,那么Bean自然是Spring中的重要资源了,那Bean的作用域又是什么,接下来我们一起进入文章详细学习吧

  8. 面试突击之跨域问题的解决方案详解

    跨域问题本质是浏览器的一种保护机制,它的初衷是为了保证用户的安全,防止恶意网站窃取数据。那怎么解决这个问题呢?接下来我们一起来看

  9. Mybatis-Plus接口BaseMapper与Services使用详解

    这篇文章主要为大家介绍了Mybatis-Plus接口BaseMapper与Services使用详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

  10. mybatis-plus雪花算法增强idworker的实现

    今天聊聊在mybatis-plus中引入分布式ID生成框架idworker,进一步增强实现生成分布式唯一ID,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

返回
顶部