图形节点优先级的设计模式



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

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

Algorithm myAlgo;

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

myAlgo = new AlgorithmNumberX;

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

每种方法都有哪些优势?

我个人会选择选项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 algorithm = AlgorithmStrategy.getAlgorithm("Algorithmx");

从组合中检索"Algorithmx"的位置

为什么要在上面加上Design Patterns标签,却根本不提它们?

这显然是战略模式的工作。

这里值得思考的另一件事是对图本身进行泛型,因此有一种方法可以实现graph。这样你就可以有任何东西的图表,并且可以随意打分。

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

最新更新