我正在试图找出一个在加权图上运行的库的类设计。可以在该图上执行各种算法,例如,找到两个节点之间的最短距离,两个节点之间的最长距离,距离小于10(例如)的两个节点之间的路径的数量等。 p>
我关心的不是如何为图表实现算法或数据结构,因为我知道如何做到这一点,而是在整体高级类设计上。关键是在未来我们可能想要添加其他算法,因此解决方案应该易于扩展。实现的一个选择就是编写一个具有实现这些算法的方法的类。然后,将来可以为此类添加其他方法以用于任何新算法。
public class GraphCalculator
{
Graph _graph;
public int GetLongestDistance(string startPlaceName, string endPlaceName)
{
}
public int GetShortestDistance(string startPlaceName, string endPlaceName)
{
}
public int GetNumberOfPaths(int minimumDistance)
{
}
//any new algorithms will be implemented as new methods added to this class
}
我担心这违反了SOLID开放/封闭原则。应该是每个算法都在自己的类中实现吗?如果是这样,推荐的类结构是什么,以便它松散耦合并且易于测试,以及如何从公共API层调用它?是否有任何推荐的设计模式?
答案 0 :(得分:0)
为什么要开始使用它自己的class
?它不会对它自己做任何有用的事情,只是包装Graph
实例,并且知道它提供的所有内容都是Graph
上的函数。您是否考虑在辅助类中创建static
函数,而是将所有相关参数传递到其中?
或者,如果您希望实现可互换,则可以考虑Strategy Pattern。
答案 1 :(得分:0)
你的问题的答案每个算法应该在自己的类中实现绝对是是!您说,您希望易于扩展的解决方案。一个单个类,具有实现这些算法的方法。然后将来可以为这个类添加其他方法用于任何新算法。它根本不可扩展!您正在更改代码,您需要修改您当前的基础实施!这与OOP原则正好相反 - 关闭修改,但可以扩展!
您必须实现的每个算法(目前或将来)都是一种行为,应使用接口进行定义。所有实现都应该实现这个通用接口。这样,您还可以轻松地自行测试每个算法实现。这样您还可以定义一个算法列表,这些算法可以轻松地动态维护(通过代码或配置)。考虑到这一切,您需要的是某种插件架构。
符合您需求的一种设计模式可能是Visitor pattern,因为它会向现有数据结构(图形对象)添加新操作(=最短路径,最长路径等算法)。
另一种选择可能是PlugIn design pattern,尽管IMO这种模式可能比访问者更具挑战性。如果可以使用第三方软件和现有框架,您可以查看Sprint plugin project,它使用Spring框架并定义可插入架构助手。 (有些)类似的.NET解决方案是Managed Extensibility Framework和/或Enterprise Library - Unity Application Block。