首页 > 代码库 > C++ wxFormBuilder进阶:通过类继承实现UI和处理逻辑的解偶
C++ wxFormBuilder进阶:通过类继承实现UI和处理逻辑的解偶
通过 wxFormBuilder 设计了应用程序的界面,并且可以运行了。
但是这款应用程序仅仅停留在可以运行的阶段,从设计、维护的角度分析,还存在众多缺陷。
在本文中,会结合 wxFormBuilder 工具,谈一谈如何使这款应用更加易于维护。
本文中主要阐述一个问题:如何将 GUI 设计和业务逻辑设计剥离。wxFormBuilder 提供了非常强大的自动生成代码的功能,这也是我们选择 wxFormBuilder 的主要原因。但是使用过后,会发现如果在通过 wxFormBuilder 设计完 UI 之后,后期 UI 如果稍有变化,那么就必须重新合并 UI 部分和我们定制的业务逻辑代码。
针对这种情况,面向对象思想中,通过“类继承”可以非常容易的避免这种问题带来的麻烦。首先看下图:
在上面的 UML 中我们要设计一个查找窗口(FindDialog),其中包含了两个类:FindDialogBase 与 FindDialog,并且后者继承于前者。在设计的过程中,FindDialogBase 类完全由 wxFormBuilder 设计并自动生成代码。FindDialog 在继承之后,除了显示查找窗口外,还有一个额外的需求:
能够记录下用户所有的查找记录。
下面对这个需求进行一下简单的分析:
1、每次用户点击查找进行所有的时候,将用户输入的内容进行记录;
2、当用户关闭查找窗口,或者点击“Quit”结束查找的时候,将记录的条目固化到硬盘上;
3、下次用户调出查找窗口的时候,从硬盘上读取上次保存的条目,并初始化到查找输入框的下拉选单中。
通过以上的分析,自然可以看到,在子类 FindDialog 中需要一个保存用户输入条目的变量,并且需要在初始化(构造)和退出之时加载和保存此变量的值到硬盘上。
实现类继承的代码如下:
class FindDialog ( FindDialogBase ): ‘‘‘ Implement the Find Dialog; ‘‘‘ def __init__ (self, parent, filename = HIST_FILENAME): FindDialogBase.__init__(self, parent) # The history filenane; self.HistFilename = filename # The find history; self.FindHistory = [] # Disable the **Find** Button; self.m_btnFind.Enable(False) # Initialize the find history; self.__InitFindHistory() # Initialize the String Combo List; self.__InitFindComboBox() # Set window focus; self.m_cmbString.SetFocus()
这样通过类的继承,就将 UI 与业务处理逻辑进行了剥离,实现了解偶。比如,在用户的时候过程中,还会不断提出新的需求,比如:
1、增加复选框,用于指定是否大小写敏感;
2、对输入内容进行过滤;
3、向前搜索,向后搜索;
4、……
用户的需求会一直不断变化,唯有实现了 UI 和处理逻辑解偶,才能更加从容的应对变化。
C++ wxFormBuilder进阶:通过类继承实现UI和处理逻辑的解偶