Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/328.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
java中实现具有相似签名的大型方法集的最佳设计模式是什么?_Java_Design Patterns - Fatal编程技术网

java中实现具有相似签名的大型方法集的最佳设计模式是什么?

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,

我想在中实现下面类中的所有cdl(蜡烛棒模式)方法

大约有61种cdl分析方法,其中大约90%具有相似的特征,只是它们的核心实现不同

例如:

 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
}
  • 对于这种情况,java中最好的设计模式是什么
  • 如果我在这样的场景中使用反射,是否会出现性能问题

  • 在这种情况下,应该避免反射,因为您将失去安全性和性能,而只需输入更少的内容


    在这种情况下,我只会使用接口层次结构或基于方法签名相同/共享实现细节的抽象类。

    在这种情况下,应该避免反射,因为您将失去安全性和性能,只需输入更少的内容


    在本例中,我只使用接口层次结构或基于方法签名相同/实现细节共享的抽象类。

    创建公共数据点的最终类(类似于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... 
        }
    });
    ...