要解决的问题:为图的所有节点赋予优先级(int值)。有一个DAG类,其属性为Graph(来自JGraphT库的DirectedGraph类型)。此外,必须有不同的算法来分配优先级,并且必须可以在将来添加新算法而无需修改现有代码。 首先创建DAG,然后用户可以选择使用哪种算法(使用GUI中的ComboBox)。用户必须随时可以更改算法。
方法1: 为算法开发接口(算法),并使所有算法实现该接口。 在DAG类中,添加一个新属性:
Algorithm myAlgo;
每次用户在GUI上选择不同的算法时,都要实例化该算法:
myAlgo = new AlgorithmNumberX;
方法2: 独立编写优先级排序任务(不作为DAG的属性),使用静态方法优先处理DAG的节点,方法是将DAG作为参数发送并返回修改后的DAG。
每种方法有哪些优势?
答案 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。这样你就可以得到任何东西的图表,并且可以随意给它们打分。
这里的另一个问题是这个得分的目的是什么?订购吧?所以你基本上是在制作索引,不是吗?你可能想要其他订单?因此,某些组织中您可以将不同的订单组合在一起是有意义的,那么您可以在不进行干预重建的情况下在它们之间进行切换(如您所述)。