java - 一长串 if/else/execute 代码分支的最佳设计模式/方法

标签 java oop design-patterns refactoring

我有一个要重构的“遗留”代码。
该代码基本上对服务器进行远程调用并返回回复。然后根据回复相应执行。
代码框架示例:

public Object processResponse(String responseType, Object response) {
    if(responseType.equals(CLIENT_REGISTERED)) {  
       //code  
       //code ...
    }  
    else if (responseType.equals(CLIENT_ABORTED)) {
       //code  
       //code....
    }    
    else if (responseType.equals(DATA_SPLIT)) {
      //code
      //code... 
   }  
   etc  

问题是有很多很多 if/else 分支,每个 if 里面的代码都不是微不足道的。
所以它变得很难维护。
我想知道最好的模式是什么?
我的一个想法是创建一个方法名称与 responseType 相同的对象,然后在 processResponse 中使用反射调用与 responseType 名称相同的方法。
这将清理 processResponse 但它会将代码移动到具有许多/许多方法的单个对象,我认为反射会导致性能问题。
有没有好的设计方法/模式来解决这个问题?

最佳答案

两种方法:

  1. 策略模式 http://www.dofactory.com/javascript/strategy-design-pattern
  2. 创建字典,其中键是元数据(在您的例子中元数据是 responseType),值是一个函数。

例如:

把它放在构造函数中

responses = new HashMap<string, SomeAbstraction>(); responses.Put(CLIENT_REGISTERED, new ImplementationForRegisteredClient()); responses.Put(CLIENT_ABORTED, new ImplementationForAbortedClient());

哪里ImplementationForRegisteredClientImplementationForAbortedClient实现 SomeAbstraction

并通过 responses.get(responseType).MethodOfYourAbstraction(SomeParams);

如果你想遵循DI的原则,你可以在你的客户端类中注入(inject)这个Dictionary。

关于java - 一长串 if/else/execute 代码分支的最佳设计模式/方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28916857/

相关文章:

java - Tomcat 8 与 Maven 的集成

java - 如何通过 POST 方法使用 Google 的 freebase?

java - 我应该如何设计我的 DAO 层

python - 更新进度条-MVP模式

design-patterns - 不使用接口(interface)的适配器模式

java - 在正确的地方使用正确的构建器

.net - 在 .NET 中对私有(private)方法进行单元测试的最佳实践是什么?

java - 在不提供哈希码的情况下从 Redis 中检索 Person 对象

php - PHP 中的 OOP 方法

java - 我如何能够在 fragment 的 ImageView 中显示大量图像?