0

要解决的问题:为图的所有节点赋予优先级(int 值)。有一个带有属性 Graph 的 DAG 类(来自 JGraphT 库的 DirectedGraph 类型)。而且,必须有不同的算法来分配优先级,并且将来必须可以在不修改现有代码的情况下添加新的算法。首先创建 DAG,然后用户可以选择使用哪种算法(使用 GUI 中的 ComboBox)。用户必须能够随时更改算法。

方法一:为算法开发一个接口(算法),并让所有算法实现该接口。在 DAG 类中,添加一个新属性:

Algorithm myAlgo;

每次用户在 GUI 上选择不同的算法时,实例化该算法:

myAlgo = new AlgorithmNumberX;

方法二:独立编写优先级任务(不作为 DAG 的属性),使用静态方法对 DAG 的节点进行优先级排序,将 DAG 作为参数发送并返回修改后的 DAG。

每种方法都有哪些优点?

4

2 回答 2

1

我个人会选择选项 1(就像我最近所做的那样)。您基本上是在描述一种策略模式(实际上是两个选项的组合)。使用这种方法可能遇到的唯一问题是将类名输入组合框中。您还需要添加一个为您创建实例的对象。如果您执行新的 Algorithmx,您将需要为您添加的每个算法添加另一个这样的语句,这违反了您所说的要求。

public class AlgorithmStrategy
{
    public static final Algorithm getAlgorithm(String className)
    {
        Algorithm algorithm = null;         
        String name = "<package algorithms are in>." + className;           
        try 
        {
            algorithm = (Algorithm)Class.forName(name).newInstance();
        } catch (InstantiationException | IllegalAccessException
                | ClassNotFoundException e) {
            e.printStackTrace();
        }           
        return algorithm;
    }
}

在此示例中,算法是您的界面。创建每个具体的类来实现您的接口并相应地确定您的优先级。

像这样使用:

Algorithm algorithm = AlgorithmStrategy.getAlgorithm("Algorithmx");

从您的组合中检索“Algorithmx”的位置

于 2014-03-06T11:52:48.207 回答
1

为什么你把设计模式标签放在上面,然后根本不提它们?

这显然是Strategy Pattern的工作。

这里值得考虑的另一件事是对图本身进行泛化,因此有一种方法来做 Graph. 这样你就可以得到任何东西的图表,并能够随意给它们打分。

这里的另一个问题是这个评分的目的是什么?订购,对吧?所以你基本上是在制作一个索引,不是吗?你可能想要其他订单?因此,一些可以将不同订单组合在一起的组织是有意义的,那么您可能可以在它们之间切换而无需干预重建(正如您所提到的)。

于 2014-03-06T15:12:34.577 回答