【发布时间】:2012-03-09 16:33:46
【问题描述】:
我的应用程序架构遇到了障碍。我刚刚开始使用访问者模式在运行时我不知道的抽象对象上执行特定的算法。 我的问题是我的算法也依赖于嵌套抽象类型的类型。
让我来说明一下我的意思:
我有一个抽象的 DataSource 类。由此我实现了具体的 DataSourceReference 和 DataSourceExplicit 类。我还有一个抽象的报告类(反序列化的元数据),我从中实现了具体的报告类 ReportTypeA 和 ReportTypeB。创建这些对象时,它们的 DataSource 可以是任何扩展的 DataSource 类。
我需要 both,即实际的 Report 类型和 DataSource 类型,以便我可以相应地执行。我可以使用访问者模式获得一致的报告类型,但不知道如何为 DataSource afterwards/also 执行相同的操作。
访问 Report 后我无法访问 DataSource,因为我会丢失 Report 的具体类型(因为您必须让它接受基本的 Report 类型:Accept(SomeDataSourceVisitor d, MetaReport m) - 或重载每个可能的报告类型,这违背了访问者模式的目的。看到我的问题了吗?
有什么想法吗?我不想使用动态,因为它不需要新报告类型的开发人员确保调度程序(访问者)支持新报告。
当前代码:
public abstract class DataSource
{
}
public class DataSourceReference : DataSource
{
// reference thing(s)
}
public class DataSourceExplicit : DataSource
{
// explicit thing(s)
}
public abstract class Report
{
// some shared Report attribute(s)
// ...
public DataSource DataSource { get; set; }
public abstract FinalReport Execute(IReportExecutionDispatcher d);
}
public class ReportA : Report
{
// ReportA specific attribute(s)
// ...
public override Execute(IReportExecutionDispatcher d)
{
d.ExecuteReport(this);
}
}
public class ReportB : Report
{
// ReportB specific attribute(s)
// ...
public override Execute(IReportExecutionDispatcher d)
{
d.ExecuteReport(this);
}
}
public interface IReportExecutionDispatcher
{
FinalReport ExecuteReport(ReportA);
FinalReport ExecuteReport(ReportB);
}
【问题讨论】:
-
你能提供更多关于算法的细节吗?为什么你需要知道具体的类?为什么 DataSource \ Report 上的多态实例方法还不够?
-
我需要知道具体的报告类类型,因为它们的报告特定属性。根据这些属性,您将相应地执行。我们需要知道它包含的数据源的类型,以便获取它引用的数据提供者/或其他类型的数据源。
标签: architecture abstraction visitor-pattern double-dispatch multiple-dispatch