Java 可以替换if语句的设计模式

Java 可以替换if语句的设计模式,java,spring-mvc,design-patterns,Java,Spring Mvc,Design Patterns,我们的应用程序越来越复杂,它主要有3个流程,并且必须基于3种类型中的一种进行处理。其中许多功能相互重叠 所以,目前的代码完全是if-else语句,它是混乱的,没有组织。如何制作一个模式,使3个流彼此清晰地分开,但利用可重用性的力量 请提供一些想法,这是一个MVC应用程序,我们需要在其中使用jaxb技术生成和使用web服务 可能您可以将应用程序视为单个对象作为输入,需要根据运行时值实施不同的策略。如果没有对应用程序结构的描述或概述,您的问题非常广泛,几乎无法回答。然而,我也遇到过类似的情况,我采取

我们的应用程序越来越复杂,它主要有3个流程,并且必须基于3种类型中的一种进行处理。其中许多功能相互重叠

所以,目前的代码完全是if-else语句,它是混乱的,没有组织。如何制作一个模式,使3个流彼此清晰地分开,但利用可重用性的力量

请提供一些想法,这是一个MVC应用程序,我们需要在其中使用jaxb技术生成和使用web服务


可能您可以将应用程序视为单个对象作为输入,需要根据运行时值实施不同的策略。

如果没有对应用程序结构的描述或概述,您的问题非常广泛,几乎无法回答。然而,我也遇到过类似的情况,我采取的方法是:

尽可能用多态性替换条件

它主要有3个流程,必须基于这3个流程之一进行处理 类型。其中许多功能相互重叠

你说你的项目有3个主要的流程,而且很多代码彼此重叠。这听起来像是一种战略模式:

您可以声明一个定义流执行的任务的接口

public interface Flow{
   public Data getData();
   public Error validateData();
   public void saveData();
   public Error gotoNextStep();
}
您创建了一个抽象类,该类提供了所有3个流所共有的实现。(这个抽象类中的方法不一定是最终的,但你一定要仔细考虑。) 最后,创建3个从抽象类扩展而来的具体类,并为给定流定义具体实现

public class BankDetailsFlow extends AbstractFlow{

   public BankDetailsData getData(){
     BankDetailsData data = new BankDetailsData();
     data.setSwiftCode(/*get swift code somehow*/);
     return data;
   }

   public Error validateData(){
      BankDetailsData data = getData();
      return validate(data);
   }

   public void onFormSubmitted(){
      Error error = gotoNextStep();
      if(error != null){
        handleError(error);
      }
   }
}

您没有指定您的
if else
语句正在执行的操作。说他们根据一些
过滤
ing

如果我没弄错你的问题,你想看看

这是一种干净的方法,易于维护并生成可读代码。添加或删除
过滤器
也很简单,只需删除该类并将其从
FilterFactory
hashmap中删除即可

创建一个接口:过滤器

 public interface Filter {
    void Filter();
 }
创建一个工厂,根据您的
值返回正确的过滤器。现在,您可以使用以下命令,而不是
if-else

  Filter filter = FilterFactory.getFilter(value);
  filter.filter();
编写FilterFactory的一种常见方法是在其内部使用
HashMap

public class FilterFactory{
   static HashMap<Integer, Filter> filterMap;
   static{
       filterMap = new HashMap<>();
       filterMap.put(0,new Filter0());
       ...
   }
   // this function will change depending on your needs
   public Filter getFilter(int value){
       return filterMap.get(value);
   }

}

注意:当您想重用某些方法时,请创建一个
FilterUtility
类,并使您的所有筛选器扩展该类,以便您可以使用所有函数而无需重写它们。

让我们举个例子,假设您有一个模型say“Data”[它具有一些属性和getter、setter、可选方法]。在移动应用程序的上下文中,特别是Android应用程序,可以有离线或在线两种模式。若设备连接到网络,数据将被发送到网络,或者存储到设备的本地数据库。 以程序化的方式,有人可以将两个模型定义为在线数据、离线数据,并将代码编写为[代码不精确,就像伪代码一样]:

if(Connection.isConnected()){
   OnlineData ond=new OnlineData();
   ond.save();//save is called which stores data on server using HTTP.
}
else{
   OfflineData ofd=new Onlinedata();
   ofd.save();//save is called which stores data in local database
}
实现这一点的一个好方法是使用OOPS原则:

程序到接口而不是实现 让我们看看如何做到这一点。 我只是在编写代码片段,这些代码片段将更有效地表达我的意思。代码片段如下:

public interface Model {
   long save();//save method 
   //other methods .....
}


public class OnlineData extends Model {
  //attributes  
  public long save(){
    //on-line implementation of save method for Data model
  }
  //implementation of other methods.
}

public class OfflineData extends Model {
  //attributes  
  public long save(){
    //off-line implementation of save method for Data model
  }
  //implementation of other methods.
}
public class ObjectFactory{
   public static Model getDataObject(){
     if(Connection.isConnected())
         return new OnlineData();
     else 
         return new OfflineData();

  }
}
下面是客户端类应该使用的代码:

public class ClientClass{
    public void someMethod(){
      Model model=ObjectFactory.getDataObject();  
      model.save();// here polymorphism plays role...
   }
}
这还包括:

public interface Model {
   long save();//save method 
   //other methods .....
}


public class OnlineData extends Model {
  //attributes  
  public long save(){
    //on-line implementation of save method for Data model
  }
  //implementation of other methods.
}

public class OfflineData extends Model {
  //attributes  
  public long save(){
    //off-line implementation of save method for Data model
  }
  //implementation of other methods.
}
public class ObjectFactory{
   public static Model getDataObject(){
     if(Connection.isConnected())
         return new OnlineData();
     else 
         return new OfflineData();

  }
}
单一责任原则[SRP]
因为在线和离线是两种不同的职责,我们可以使用if-else语句将其集成到单个save()中。

长期以来,我发现像“drools”这样的开源规则引擎框架非常适合我的需求

请发布这段意大利面代码的一部分(或全部),以便我们能够给您真实而有意义的响应。这取决于此代码的逻辑。首先想到的是实现决策表以摆脱if/else语句。亲爱的,这取决于您的用例。工厂模式可能会有所帮助,或者策略可能会有所帮助,但也可能有其他一些模式。除非您发布更多详细信息,否则很难回答,但您正走在寻求帮助的正确道路上。这可能更适合,因为您已经有了代码,并且希望知道如何改进它。
public class ClientClass{
    public void someMethod(){
      Model model=ObjectFactory.getDataObject();  
      model.save();// here polymorphism plays role...
   }
}