设计一个Windows应用程序来维护MDI子表单中的状态

时间:2015-05-06 06:31:30

标签: c# design-patterns architecture ooad

这是一篇相当长的帖子,我将尽力解释我开发的应用程序的工作情况,并希望您的帮助将其扩展到未来。

我需要在C#中设计一个基于Windows的应用程序,它基本上监视来自外部通信源的事件并在图形上绘制数据。应用程序订阅来自通信对象的事件,并在有数据事件时更新UI。这些监控类中的图形组件将使用通信数据缓冲区内的数据将数据绘制为折线图。

enter image description here

为了实现这一点,我创建了一个Factory类,它将根据我提供的Model信息(设备模型类型)实例化一个特定的监控类(CWindowFirst或CWindowSecond等)。

这些类实现了用于初始化,数据获取和清理操作的标准契约(IFactoryInterface)。因此,在任何给定的时间点,我都可以实例化一个特定的类并启动监视操作以接收数据并在该过程中填充图形。到目前为止,我可以以特定设备的图形形式显示数据。此时,只要主应用程序选择另一个窗口(即CWindowSecond或CWindowThird),我就会销毁(处置)CWindowFirst的对象。 )。

正如俗话所说,SW开发中唯一不变的是变更",我需要为用户提供图表的暂停/停止功能选项。 我应该可以暂停图形(即暂停数据通信)并转到主窗口播放,也应该能够打开另一个窗口(CWindowSecond)再次与图形一起播放(应该能够暂停这里也有沟通)。回到第一个窗口CWindowFirst并恢复以前保存的数据通信。

现在出现了百万美元的问题,我如何实现或者更改现有设计以实现上述功能。

我可以想到以下实施,但我不确定它是否真的是务实的。

关于暂停命令的问题我将

  1. 停止暂停通讯(取消订阅通讯事件)。
  2. 将事件数据缓冲区和图形的状态保存在集合中。
  3. 退出前将整个对象序列化为文件。
  4. 返回相同的表单后,我将反序列化对象
  5. 从反序列化对象
  6. 获取事件数据缓冲区
  7. 填充图表并启用事件处理程序,以便我继续从通信层接收事件。
  8. 那里的专家我需要你的帮助。请指导/建议改进/分享您的想法

1 个答案:

答案 0 :(得分:1)

正如HansPassant评论的那样,将数据(或上下文,或经理,无论如何)与视图分开。带有上下文构造函数注入的Singleton是最好的选择恕我直言。

使用非最干净的单身方式的例子:

public class MonitoringContext {
    public static MonitoringContext CurrentContext = new MonitoringContext();

    // handle generating data
    // handle populating data needed for graph
    // handle other action from other forms as well
}

public class FormGraph : Form{
    // default constructor if you do not have access to MDI
    public FormGraph(){
        this.context = MonitoringContext.CurrentContext;
    }
    public FormGraph(MonitoringContext context){
        this.context = context;
    }
    MonitoringContext context;

    // do whatever you want with context
}

public class FormOther : Form{
    // default constructor if you do not have access to MDI
    public FormOther(){
        this.context = MonitoringContext.CurrentContext;
    }
    public FormOther(MonitoringContext context){
        this.context = context;
    }
    MonitoringContext context;

    // do whatever you want with context
    // any changes reflected at the FormGraph
    // because of same reference and mutability
}

当然,这是来自局外人的建议方法,他们不了解需求和当前架构的内涵和细节。应进行任何调整以满足要求。