将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类,比如:
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
界面将是策略的界面,您的过滤器将根据用户的选择包含这些策略的集合。