gpt4 book ai didi

java - 在java中创建可配置对象存储库的最佳方法是什么?

转载 作者:行者123 更新时间:2023-12-01 11:35:10 24 4
gpt4 key购买 nike

为了解释更多,我想要的是根据客户端服务器架构中的一些参数来识别传入请求。假设我在服务器上收到一个请求,其中包含一些参数,例如 command=xyzparam1=blahparam2=blah2

some.property.xyz=com.domain.BusinessFunction1some.property.abc=com.domain.BusinessFunction2

现在,在识别这些参数并查看配置后,我应该能够调用正确的业务功能,如上面的示例所示,如果我收到命令参数为 xyz 的请求,它应通过 BusinessFunction1,否则如果是 abc,则应通过 BusinessFunction2BusinessFunction1BusinessFunction2 是在两个不同的 Java 类中实现的。

最佳答案

最好的方法是创建一个单例工厂,您可以从针对服务名称 some.property.xyz 存储的数据库 com.domain.BusinessFunction1 中填充该工厂。工厂将使用反射来使用 Class.forName("com.domain.BusinessFunction1"); 来构造类,然后您可以在此类上调用一个方法,为了便于使用,该方法需要一个映射属性名称和值。就我个人而言,我会创建另一个工厂并为每个业务功能提供特定的对象。如果您没有数据库,您可以将业务函数的名称值存储在 XML 或枚举中。

这是使用 Singleton 和 HashMap 的想法。我建议您从数据库填充工厂,以提供更大的灵 active 。

通用基础接口(interface)

public interface IBusinessFunction {
public void doFunction();
public void setParameters(Map<String,String> paramMap);
}

业务职能

public class BusinessFunction1 implements IBusinessFunction {
@Override
public void doFunction() {
System.out.println(String.format("Function from business class %s called.", this.getClass().getName()));
}

@Override
public void setParameters(Map<String, String> paramMap) {

}
}


public class BusinessFunction2 implements IBusinessFunction {
@Override
public void doFunction() {
System.out.println(String.format("Function from business class %s called.", this.getClass().getName()));
}

@Override
public void setParameters(Map<String, String> paramMap) {

}
}

BusinessFactory

public class BusinessFactory {
private static BusinessFactory instance = null;
private Map<String, Class<? extends IBusinessFunction>> businessFunctionMap = null;

protected BusinessFactory() {
// Populate this from a database,
// for the ease of your example i will use a HashMap
businessFunctionMap = new HashMap<String, Class<? extends IBusinessFunction>>();
businessFunctionMap.put("some.property.xyz", BusinessFunction1.class);
businessFunctionMap.put("some.property.abc", BusinessFunction2.class);
}

public static BusinessFactory getInstance() {
if (instance == null) {
instance = new BusinessFactory();
}
return instance;
}

public IBusinessFunction getBusinessFunction(String property) {
IBusinessFunction businessFunction = null;
Class clazz = businessFunctionMap.get(property);
try {
Constructor constructor = clazz.getConstructor();
businessFunction = (IBusinessFunction) constructor.newInstance();
} catch (NoSuchMethodException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
} catch (InstantiationException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
}
return businessFunction;
}
}

测试你的类和工厂

public class Example {
public static void main(String[] args) {
Map<String,String> parameters = new HashMap<String, String>();
parameters.put("Param1","param 1 value");
parameters.put("Param2","param 2 value");

IBusinessFunction businessFunction = BusinessFactory.getInstance().getBusinessFunction("some.property.abc");
businessFunction.setParameters(parameters);
businessFunction.doFunction();
}
}

关于java - 在java中创建可配置对象存储库的最佳方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30075301/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com