设计模式可以替换if语句

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

因此,目前的代码完全是if-else语句,它们都搞砸了并且没有组织。 如何制作一个模式,使3个流清晰地相互分离,但利用可重用性的力量。

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

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

您没有指定if-else语句正在执行的操作。 假设他们根据某些value filter

如果我理解你的问题,你想看看工厂模式 。

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

创建一个接口:filter

  public interface Filter { void Filter(); } 

创建一个工厂,根据您的value返回正确的filter。 而不是你现在的if-else你可以使用以下内容:

  Filter filter = FilterFactory.getFilter(value); filter.filter(); 

编写FilterFactory的一种常见方法是在其中使用HashMap

 public class FilterFactory{ static HashMap 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); } } 

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

 public class Filter0 implements Filter { public void filter(){ //do something } } 

注意:由于您要重用某些方法,请创建一个FilterUtility类,并使所有filter扩展此类,以便您可以使用所有函数而无需重写它们。

如果没有对应用程序结构进行一些描述或概述,您的问题就会非常广泛,几乎无法回答。 但是,我一直处于类似的情况,这是我采取的方法:

尽可能用多态性替换条件

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

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

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

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

您创建一个抽象类,该类提供所有3个流共有的实现。 (这个抽象类中的方法不一定是最终的,但你肯定要仔细考虑它。)

 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个具体类,这些类从抽象类扩展并定义给定流的具体实现。

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

让我们举个例子,假设你有模型说“数据”[它有一些属性和getter,setter,可选方法]。在Mobile应用程序的上下文中,特别是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原则:

程序接口不实现

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

 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... } } 

这也是如下:

单一责任原则[SRP]

因为On-line和Off-line是两个不同的职责,我们可以使用if-else语句在Single save()中集成。

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