可以替代 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”这样的开源规则引擎框架是满足我要求的一个很好的选择。
我们的应用程序越来越复杂,它主要有 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”这样的开源规则引擎框架是满足我要求的一个很好的选择。