用于图节点优先级排序的设计模式

时间:2014-03-06 11:32:34

标签: java design-patterns jgrapht

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

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

Algorithm myAlgo;

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

myAlgo = new AlgorithmNumberX;

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

每种方法有哪些优势?

2 个答案:

答案 0 :(得分: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”

答案 1 :(得分:1)

为什么你把Design Patterns标签放在这上面然后根本不提它们呢?

这显然是Strategy Pattern的工作。

另一件值得思考的事情是对图表本身进行泛化,因此有办法做Graph。这样你就可以得到任何东西的图表,并且可以随意给它们打分。

这里的另一个问题是这个得分的目的是什么?订购吧?所以你基本上是在制作索引,不是吗?你可能想要其他订单?因此,某些组织中您可以将不同的订单组合在一起是有意义的,那么您可以在不进行干预重建的情况下在它们之间进行切换(如您所述)。