Java 可以替换if语句的设计模式
我们的应用程序越来越复杂,它主要有3个流程,并且必须基于3种类型中的一种进行处理。其中许多功能相互重叠 所以,目前的代码完全是if-else语句,它是混乱的,没有组织。如何制作一个模式,使3个流彼此清晰地分开,但利用可重用性的力量 请提供一些想法,这是一个MVC应用程序,我们需要在其中使用jaxb技术生成和使用web服务Java 可以替换if语句的设计模式,java,spring-mvc,design-patterns,Java,Spring Mvc,Design Patterns,我们的应用程序越来越复杂,它主要有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...
}
}