【发布时间】:2011-01-04 09:38:05
【问题描述】:
我想知道是否有一种模式可以将类的域逻辑与域层中对象的 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 值。程序集从文件表示中加载,并被设计为组合。每个具体的零件类都存储一些数据来实现CalculateX(in,out) 方法来模拟整个装配体的行为。该应用程序运行良好,但没有 GUI。为了提高可用性,应在现有实现之上开发 GUI(允许对现有代码进行更改)。 GUI 应显示装配的示意图,并提供特定于零件的对话框来编辑多个参数。
为了实现这些目标,应用程序需要为每个机器部件提供新功能,以便在屏幕上绘制示意图、显示属性对话框和其他与机器仿真领域无关的内容。我可以想出一些不同的解决方案来为每个部分实现Draw(Screen) 功能,但我对每个部分都不满意。
首先我可以向 MachinePart 接口添加一个 Draw(Screen) 方法,但这会将域代码与 ui 代码混淆,我必须向每个机器部件类添加很多功能,这使得我的域模型难以阅读和很难明白。
另一个“简单”的解决方案是让所有部分都可访问并在访问者中实现 ui 代码,但访问者不属于我最喜欢的模式。
我可以从每个机器部件类派生 UI 变体以在其中添加 UI 实现,但我必须检查每个部件类是否适合继承,并且必须小心更改基类。
我目前最喜欢的设计是创建一个并行复合层次结构,其中每个组件存储数据以定义一个机器部件,具有 UI 方法的实现和一个创建相应域类实例的工厂方法,以便我可以“转换” UI 程序集到域程序集。但是,从创建的域层次结构返回到 UI 层次结构以在图形中显示计算结果时存在问题(假设某些部分在计算过程中存储了一些值,我想在模拟后在示意图中显示)。
也许这些问题有一些经过验证的模式?
【问题讨论】:
标签: model-view-controller user-interface design-patterns domain-driven-design