gpt4 book ai didi

java - 开放/封闭原则 OO 类设计

转载 作者:太空宇宙 更新时间:2023-11-03 15:50:48 29 4
gpt4 key购买 nike

我正在尝试为在加权图上运行的库找出类设计。可以在这个图上执行各种算法,例如,找到两个节点之间的最短距离,两个节点之间的最长距离,两个节点之间距离小于 10 的路径数(比方说)等。

我关心的不是我所知道的如何实现图表的算法或数据结构,而是整体高级类设计。关键是将来我们可能想要添加其他算法,因此该解决方案应该易于扩展。实现的一种选择是只编写一个类,该类具有用于实现这些算法中的每一个的方法。然后在未来可以为任何新算法向此类添加其他方法。

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 开闭原则。每个算法是否应该在其自己的类中实现?如果是这样,推荐的类结构是什么来实现这一点,使其松散耦合且易于测试,以及如何从公共(public) API 层调用它?有没有推荐的设计模式?

最佳答案

您的问题是否应该在其自己的类中实现每个算法的答案肯定是!您是在声明,您想要易于扩展 的解决方案。一个 具有实现这些算法的方法的单个类。然后在未来可以为任何新算法向此类添加其他方法。它根本不可扩展!您正在更改代码,您需要修改您当前的基本实现!这与 OOP 原则恰恰相反——对修改关闭,对扩展开放!

您必须实现的每一个算法(现在或将来)都是一种行为,应该使用接口(interface)进行定义。所有实现都应该实现这个公共(public)接口(interface)。通过这种方式,您还可以轻松地自行测试每个算法实现。这还允许您定义一个算法列表,该列表很容易动态维护(通过代码或配置)。考虑到所有这些,您需要的是某种插件架构。

一种符合您需要的设计模式可能是 Visitor pattern ,因为它向现有数据结构(图形对象)添加了新操作(= 最短路径、最长路径等算法)。

另一个选项可能是 PlugIn design pattern ,尽管在 IMO 中,这种模式实现起来可能比访客模式更具挑战性。如果可以使用 3th 方软件和现有框架,你可以看看 Sprint plugin project ,它使用 Spring 框架并定义了一个可插入架构助手。 .NET 的(有点)类似的解决方案是 Managed Extensibility Framework和/或 Enterprise Library - Unity Application Block .

关于java - 开放/封闭原则 OO 类设计,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25949652/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com