具有 2 个状态的列表视图控件的设计模式

本文关键字:视图 控件 设计模式 列表 具有 状态 | 更新日期: 2023-09-27 18:30:58

我在Windows窗体中具有ListView控件,这是由于在图标视图或详细信息视图中显示项目列表。我想分离 ListView 状态逻辑并创建 2 个状态类 IconsState 和 DetailsState,从 IState 中获取它们,具有要从 UI 窗口调用的所有方法。

在详细信息视图中有 RetrieveVirtualItem 事件,在图标视图中有 DrawItem 事件。为了从 UI 中存在的 IState 变量调用它们,两个状态的后代类都必须实现它们。将 DrawItem 置于详细信息状态中,除了返回之外什么都不做。IconsState中的RetrieveVirtualItem也是如此。

是否有另一种设计方法可以避免在状态中实现空方法?

具有 2 个状态的列表视图控件的设计模式

是的,有更好的方法。强迫一个类有一个不应该在那里的成员是一种设计气味,即用你的话来说"在 DetailsState 中拥有 DrawItem 除了返回之外什么都不做"。

或者,您可以使用 MVP 模式,这将允许您获得更高的可测试性。在 MVP 的被动视图变体中,您将拥有一个模型、两个哑视图和一个演示器,该演示器根据用户选择决定呈现哪个视图。

有关 MVP 的其他资源:
MVP 的 SO 标签
被动视图示例
适用于 Windows 窗体的 MVP 示例