2014-03-06 45 views
0

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

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

Algorithm myAlgo; 

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

myAlgo = new AlgorithmNumberX; 

方法2: 独立地写优先任务(不作为DAG的属性),请使用静态方法来优先化DAG的节点,方法是将DAG作为参数发送并返回修改的DAG。

每种方法都有哪些优点?

+2

该算法不是图的固有部分,所以我不建议将它作为字段存储。但我不确定为什么你提出了第二种方法的“静态”方法。为什么不是'interface Algorithm {void workOn(Graph g); }'? (顺便说一句:优先级是直接存储在DAG(或其节点)中,还是通过外部数据结构(如“Map ”)?) – Marco13

+0

优先级直接存储在DAG的节点中。当然,我需要创建一个接口,所以以后可以添加多个算法。但关键是我不确定算法是否应该是自己图的属性,还是独立的问题。 – capovawi

回答

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”从您的组合中检索

+0

这似乎是根据组合中选定的选项自动创建算法的好选择。是的,战略模式是我需要隔离代码的变化部分,即算法。 – capovawi

+0

我认为在包名称和类名onesixtyfourth之间缺少一个点(。):String name =“<程序包算法在>”。 + className; – capovawi

+0

是的,我将编辑 – onesixtyfourth

1

你为什么把设计模式标签在这个再没有提到他们呢?

这显然是Strategy Pattern的工作。

另一件值得思考的事情就是对图形本身进行泛化,所以有一种方法可以实现Graph。这样你就可以得到任何图形并能够随意评分。

这里的另一个问题是这个得分的目的是什么?订购,对吗?所以你基本上正在制作一个索引,不是吗?你可能想要其他顺序?因此,一些组织可以将多个不同的订单分组在一起,这样做会很有意义,那么您可能可以在没有干预重建的情况下切换它们(如您所述)。

+0

对不起,不提模式的名称,我仍然是这个领域的新手。目的是根据每个节点的优先级值获得一个有序列表,是的。但我不需要同时订购不同的订单。当用户通过GUI选择prio标准时,优先级可能会随时完成。 – capovawi