我想知道是否有一种模式如何将类的域逻辑与域层中对象的ui职责分开。
示例:
// Domain classes
interface MachinePart
{
CalculateX(in, out)
// Where do we put these:
// Draw(Screen) ??
// ShowProperties(View) ??
// ...
}
class Assembly : MachinePart
{
CalculateX(in, out)
subParts
}
class Pipe : MachinePart
{
CalculateX(in, out)
length, diamater...
}
有一个应用程序可以计算从许多机器部件组装的机器的X值。程序集从文件表示加载,并设计为复合。每个具体的part类都存储一些数据来实现CalculateX(in,out)
方法来模拟整个程序集的行为。该应用程序运行良好,但没有GUI。为了提高可用性,应该在现有实现之上开发GUi(允许对现有代码进行更改)。 GUI应显示装配体的示意图形表示,并提供部件特定对话框以编辑多个参数。
为了实现这些目标,应用程序需要每个机器部件的新功能,以在屏幕上绘制原理图表示,显示属性对话框以及与机器仿真域无关的其他内容。我可以想到一些不同的解决方案来为每个部分实现Draw(Screen)
功能,但我对每个部分都不满意。
首先,我可以向MachinePart界面添加Draw(Screen)
方法,但这会将域代码与ui代码混淆,我必须为每个机器零件类添加许多功能,这使得我的域模型很难阅读并且难以理解。
另一个“简单”的解决方案是让所有部件都可访问并在访问者中实现ui代码,但访问者不属于我最喜欢的模式。
我可以从每个机器零件类派生UI变体来添加UI实现,但我必须检查每个零件类是否适合继承,并且必须小心对基类的更改。
我目前最喜欢的设计是创建一个并行复合层次结构,其中每个组件存储数据以定义机器部件,具有UI方法的实现,以及创建相应域类的实例的工厂方法,以便我可以“转换” UI程序集到域程序集。但是,从创建的域层次结构返回到UI层次结构有一些问题,例如在图形中显示计算结果(想象一些部分在计算期间存储一些值,我希望在模拟后的示意图表示中显示)。 p>
也许这些问题有一些经证实的模式?
答案 0 :(得分:0)
您可以查看model-view-presenter (mvp)和model-view-viewmodel (mvvm)模式。
Fowler的presentation model包括两个示例应用程序;它也可能对你感兴趣。
我认为调查这些模式会给你一些如何继续的想法。 Mvvm看起来很像你当前的解决方案;如果我是你,我会从那里开始。
答案 1 :(得分:0)
同意@Marjin,并概括他的回答。你需要的是Model-View-Controller,其中MVP和MVVM是变体。从您的评论中我认为您理解这一点,但需要了解如何实现该模式。不知道你的语言和目标架构很难给出绝对的细节。尽管如此,我还是从Observer模式开始(链接有示例代码)。
您正在处理的问题是如何提供从域到UI的可观察访问 - 而不会使用特定于UI的代码来阻碍域。观察者提供了一种方法。它确实需要域更改,特别是允许注册观察者和更改通知。但是,没有任何特定于GUI的内容,因此它可以很好地封装。
第h
PS:如果您的应用是典型的瘦客户端网络应用,则需要修改该方法。请注意:许多Web应用程序框架都被宣传为“MVC”,但实现在体系结构上与Observer模式完全不同。
答案 2 :(得分:0)
也许View Helper可以提供帮助。它不是C ++,而是Java EE模式,但在您的情况下,它肯定会将您的域对象与其演示详细信息分开......