将UI与数据/逻辑分离

本文关键字:分离 数据 UI | 更新日期: 2023-09-27 18:16:35

我正在开发一个文件索引应用程序,该应用程序生成文件元数据供第三方应用程序使用。为了减少工作集,我使用了文件过滤器。每个文件过滤器包含许多比较器(例如CompareFileName, CompareFile Extension, CompareFileDateCreated)。所有比较器实现一个简单的ICompareFile接口。

public interface ICompareFile
{
  bool Compare(IFile file);
}

这对于原始编码/测试很有效。我遇到的问题是,当尝试通过用户界面创建编辑器时。我的fileffilter类包含一个ICompareFile实例列表。所以,我的问题是,当用户从列表中选择ICompareFile时,调用编辑器的最佳方法是什么?

最初,我考虑的是访问者模式,但是,我可以将比较器委托给一个插件类,我将提供基本的,众所周知的实现。总之,解决方案必须是可扩展的。

我的目的是将表示与数据分开。例如,我可以用多种方式显示比较器。然而,数据是相当静态的。

问题实际上是关于将编辑器(某种类型)映射到ICompareFile实例。

我的问题是,ICompareFile的具体实现应该指定它的编辑器,还是应该一个外部类来做这件事。我个人认为是后者(SOLID和DRY原则)。

将UI与数据/逻辑分离

方法之一是使用工厂模式。

在你的工厂中,你将注册具体的类和它们对应的UI类,比如:

public class FileCompareUIFactory{
// pseudo code, needs work
  private Dictionary<Type,Type> registered = new {
    { typeof(FileCompareNames), typeof(FileCompareNamesUIView)}
  }
  public void Register<C,V> where C: IFileCompare, V: View{
    registered[typeof(C)] = typeof(V);
  }
  public V GetView<C,V>() where C:IFileCompare, V: View {
    // cache already instantiated if needed
    return (V)(Activator.CreateInstance(registered[typeof(C)])
  }
}

你也可以将工厂设置为单例,并要求所有插件文件比较器在工厂中注册

public class FileCompareUIFactory{
  private static FileCompareUIFactory _instance = null;
  public FileCompareUIFactory Instance{
    get{ return (_instance = _instance ?? new FileCompareUIFactory()); }
  }
  protected FileCompareUIFactory(){ }
}

我建议在这里使用策略模式,因为您正在创建一个算法,其行为是由用户组装的。您的ICompareFile界面将是策略的界面,您的过滤器将根据用户的选择包含这些策略的集合。