java中实现具有相似签名的大型方法集的最佳设计模式是什么?
我想在中实现下面类中的所有cdl(蜡烛棒模式)方法 大约有61种cdl分析方法,其中大约90%具有相似的特征,只是它们的核心实现不同 例如:java中实现具有相似签名的大型方法集的最佳设计模式是什么?,java,design-patterns,Java,Design Patterns,我想在中实现下面类中的所有cdl(蜡烛棒模式)方法 大约有61种cdl分析方法,其中大约90%具有相似的特征,只是它们的核心实现不同 例如: public RetCode cdl2Crows(int startIdx, int endIdx, double inOpen[], double inHigh[], double inLow[], double inClose[], MInteger outBegIdx,
public RetCode cdl2Crows(int startIdx,
int endIdx,
double inOpen[],
double inHigh[],
double inLow[],
double inClose[],
MInteger outBegIdx,
MInteger outNBElement,
int outInteger[])
public RetCode cdl3BlackCrows(int startIdx,
int endIdx,
double inOpen[],
double inHigh[],
double inLow[],
double inClose[],
MInteger outBegIdx,
MInteger outNBElement,
int outInteger[])
我在想,是否可以将方法名作为源类的参数传递,然后使用反射调用方法,以避免重复代码
public invokeAnalytic(String analyticMethodName, common params .....)
{
// using reflection invoke analyticMethodName of Core class
// and pass rest of the params
}
在这种情况下,应该避免反射,因为您将失去安全性和性能,而只需输入更少的内容
在这种情况下,我只会使用接口层次结构或基于方法签名相同/共享实现细节的抽象类。在这种情况下,应该避免反射,因为您将失去安全性和性能,只需输入更少的内容
在本例中,我只使用接口层次结构或基于方法签名相同/实现细节共享的抽象类。创建公共数据点的最终类(类似于C中的结构),并将其作为参数传递给函数。它有点重,但并不像您想象的那么糟糕(特别是当类被声明为
final
)。创建公共数据点的final类(类似于C中的结构),并将其作为参数传递给函数。它有点重,但没有你想象的那么糟糕(特别是如果类被声明为final
)。把参数包装成不可变的怎么样
例如
把参数包装成不可变的格式怎么样 例如 公共接口CDL 公共代码调用 ( int startIdx, int endIdx, 双不点[], 双输入高[], 双输入[], 双内藏[], MInteger outBegIdx, MInteger outNBElement, int OUTITEGER[] ); 静态映射映射=新的HashMap(); map.put(“cdl2Crows”,新的CDL() { 公共代码调用(…) { 暗示。。。 } }); ...
公共接口CDL
公共代码调用
(
int startIdx,
int endIdx,
双不点[],
双输入高[],
双输入[],
双内藏[],
MInteger outBegIdx,
MInteger outNBElement,
int OUTITEGER[]
);
静态映射映射=新的HashMap();
map.put(“cdl2Crows”,新的CDL()
{
公共代码调用(…)
{
暗示。。。
}
});
...
我认为战略模式是您的最佳选择:
我认为战略模式是您的最佳选择:
命令模式,但可能无法完全解决。这不是Java特有的问题。只需定义一个公共接口,并考虑使用代表公共数据结构的数据传输对象(DTO)。命令模式,但可能无法完全解决。这不是java特有的问题。只需定义一个公共接口,并考虑使用代表公共数据结构的数据传输对象(DTO)。这个模式/想法有名字吗?我觉得很有趣。这个模式/想法有名字吗?我觉得很有趣。
MyValueObject params = new MyValueObject(int startIdx,
int endIdx,
double inOpen[],
double inHigh[],
double inLow[],
double inClose[],
MInteger outBegIdx,
MInteger outNBElement,
int outInteger[]);
// ....
someObject.cdl2Crows(params);
// ...
someObject.cdl3BlackCrows(params);
public interface CDL
public RetCode invoke
(
int startIdx,
int endIdx,
double inOpen[],
double inHigh[],
double inLow[],
double inClose[],
MInteger outBegIdx,
MInteger outNBElement,
int outInteger[]
);
static Map<String,CDL> map = new HashMap<>();
map.put("cdl2Crows", new CDL()
{
public RetCode invoke(...)
{
impl...
}
});
...