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_Oop - Fatal编程技术网

Java 寻找一种设计模式

Java 寻找一种设计模式,java,design-patterns,oop,Java,Design Patterns,Oop,我还没有研究过设计模式,但我敢打赌,我需要做的事情肯定有一个。我在几棵树上运行了一组不同的算法。它们都实现了一个接口: public interface DistanceMetric { public double distance(AbstractTree<String> t1, AbstractTree<String> t2); } public class concreteDistanceAlgorithmV1 implements DistanceMet

我还没有研究过设计模式,但我敢打赌,我需要做的事情肯定有一个。我在几棵树上运行了一组不同的算法。它们都实现了一个接口:

public interface DistanceMetric {
    public double distance(AbstractTree<String> t1, AbstractTree<String> t2);
}

public class concreteDistanceAlgorithmV1 implements DistanceMetric{

    public double distance(AbstractTree<String> t1, AbstractTree<String> t2){
        // algorithm methods
        return distance; 
    }
}
公共接口距离度量{
公共双距离(抽象树t1,抽象树t2);
}
公共类concreteDistanceAlgorithmV1实现了距离度量{
公共双距离(抽象树t1,抽象树t2){
//算法方法
返回距离;
}
}
然而,现在我突然需要两个版本的每个算法,一个如上所述,第二个是一个变体,它对第一棵树进行了预处理:

public interface DistanceMetricType2 {
    public double distance(AbstractTree<String> t);
}

public class concreteDistanceAlgorithmV2 implements DistanceMetricType2{

    private Object transformation1;

    public concreteDistanceAlgorithmV2(AbstractTree<String> t1){
        transformation1 = process(t1);
    }

    public double distance(AbstractTree<String> t2){

        Object transformation2 = process(t2);
        //algorithm involving both transformations
        return distance;
    }
}
公共接口距离度量类型2{
公共双距离(t);
}
公共类concreteDistanceAlgorithmV2实现DistanceMetricType2{
私有对象转换1;
公共距离算法V2(抽象树t1){
转化1=过程(t1);
}
公共双倍距离(t2){
对象转换2=过程(t2);
//包含两种变换的算法
返回距离;
}
}

一定有比为每个算法生成两个类更好的方法吗?这是用于战略模式还是类似模式?如何修改我必须的内容以更好地利用好的设计原则?

如果需要在运行时选择算法,请查看。策略模式提供了一个所有算法都实现的接口。然后,您可以实例化适当的算法并调用其execute()方法


如果需要更改算法的各个部分,请查看。在模板方法中,对算法的修改会覆盖适当的方法,以提供实现完全相同目标的替代方法。这通常是通过继承抽象类来实现的。

如果需要在运行时选择算法,请查看。策略模式提供了一个所有算法都实现的接口。然后,您可以实例化适当的算法并调用其execute()方法


如果需要更改算法的各个部分,请查看。在模板方法中,对算法的修改会覆盖适当的方法,以提供实现完全相同目标的替代方法。这通常是通过继承抽象类来实现的。

我认为你是对的,这是利用策略模式的好时机。

我认为你是对的,这是利用策略模式的好时机。

旁注:你的方法应该采用接口而不是抽象类(抽象树).不一定,尽管这可能是个好主意。如果他的所有树都继承自AbstractTree,那么它可能会成功。旁注:您的方法应该采用接口而不是抽象类(AbstractTree)。不一定,尽管这可能是个好主意。如果他的所有树都继承自AbstractTree,那么它可能会成功。