可以替代 if 语句的设计模式

Design patterns that can replace if statements

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

所以目前的代码完全是 if-else 语句,乱七八糟,没有条理。如何制作一个模式,使 3 个流程彼此清楚地分开,但利用可重用性的力量。

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

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

您的问题非常广泛,如果不对您的应用程序结构进行一些描述或概述,几乎不可能回答。但是,我遇到过类似的情况,这是我采取的方法:

尽可能用多态替换条件

it has mainly 3 flow and have to process based on this one of the 3 type. Many of these functionalities overlap each other.

您说您的项目有 3 个主要流程,并且大部分代码相互重叠。这听起来像是一种策略模式:

您声明了一个接口,该接口定义了 Flow 执行的任务。

public interface Flow{
   public Data getData();
   public Error validateData();
   public void saveData();
   public Error gotoNextStep();
}

您创建了一个抽象 class,它提供了对所有 3 个流程通用的实现。 (本摘要class中的方法不必是final,但你一定要仔细考虑。)

public abstract class AbstractFlow{

   private FlowManager flowManager

   public AbstractFlow(FlowManager fm){
    flowManager = fm;
   }

   public final void saveData(){
       Data data = getData();
       saveDataAsXMl(data);
   }

   public final Error gotoNextStep(){

      Error error = validateData();
      if(error != null){
         return error;
      }

      saveData();
      fm.gotoNextStep();
      return null;
   }
}

最后,您创建了 3 个具体的 class 从抽象 class 扩展而来的实体,并为给定的流程定义了具体的实现。

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 语句在做什么。说他们 filter 取决于一些 value.

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

这是一种干净的方法,易于维护并生成可读代码。添加或删除 Filter 也很容易,只需删除 class 并将其从 FilterFactory 哈希图中删除。

创建接口:过滤器

 public interface Filter {
    void Filter();
 }

创建一个工厂,根据您的 value returns 更正过滤器。现在您可以使用以下内容代替您的 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);
   }

}

像这样创建你的三个(在你的情况下)过滤器:(虽然名称有意义)

public class Filter0 implements Filter {

    public void filter(){
      //do something
    }
}

注意: 因为你想重用一些方法,创建一个 FilterUtility class 并让你所有的过滤器扩展这个 class 所以您可以使用所有功能而无需重写它们。

让我们举个例子,假设你有模型说 "Data" [它有一些属性和 getters,setters,可选方法]。在移动应用程序的上下文中,特别是 Android 应用程序可以有离线或在线两种模式。如果设备连接到网络,数据将发送到网络,否则存储到设备的本地数据库。 以程序的方式,有人可以将两个模型定义为 OnlineData、OfflineData 并将代码编写为[代码不准确,就像伪代码]:

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 原则:

Program to interface not Implementation

让我们看看如何做到这一点。 我只是在编写代码片段,它们将更有效地代表我 mean.The 片段如下:

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();

  }
}

这是您的客户 class 应该使用的代码:

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

还有如下:

Single Responsibility Principle [SRP]

因为在线和离线是两种不同的职责,我们可以使用 if-else 语句将其集成到 Single save() 中。

经过很长一段时间后,我发现像“drools”这样的开源规则引擎框架是满足我要求的一个很好的选择。