技术开发 频道

State模式在客户端软件中的应用

2.2 类型2:(Reuse GUI)

  2.2.1 动机

  当多个客户端GUI布局、控件类型很相似,所完成的任务也相似时,只需要经过精心设计,将这些GUI的展示形式统一起来,同一个GUI可以用到多个场景中,达到重用的目的。此时,这些不同任务需要操作不同的数据集合。

  可以在GUI类中实现这些不同数据集合的操作,但是这会给程序维护带来麻烦。首先,属于不同逻辑的数据操作出现在同一类文件中,造成逻辑混乱、程序规模增大,不易于调试;其次,要将GUI用于新的数据集合时,只能在相同文件中增加新的代码,此时,该程序的可维护性降低,尤其是新的工作由其他程序员完成时,要理解原有代码是很费力的。

  和2.1.1节中提到的解决方法类似:将变化的部分和不变部分分离开来,使得变化的部分可以独立修改、扩充。具体地,则是将数据集合相关操作从GUI程序中抽取出来,定义一个所有数据集合操作的接口(即:状态接口),不同地数据集合操作作为该接口的一个实现类存在。这样,每个数据集合都独立的封装于一个状态对象内;而且,要对新的数据使用该GUI,只需要定义新的状态接口实现类即可,无须修改已有类,甚至不关心已有的状态。

  2.2.2 适用性

  本类型适用环境:不同的数据集合,相同的操作模式。即不变化的客户端GUI,将不同的数据集合操作委托给变化的状态对象去完成。

  2.2.3 结构(图3)

  图3 不同数据集合,相同操作模式

  2.2.4 参与者

  InvariableGUI:本身不发生变化的客户端GUI类,维护一个对VariableDataState的引用state,将数据相关操作委托给该引用对象 ;

  saveChangeToServer():调用state.processData(this)完成数据相关操作;

  VariableDataState:State接口,封装与数据相关操作的行为;

  ProcessData(gui:InvariableGUI):调用参数gui的成员获取数据并完成处理;

  DataState1、DataState2、 … … DataStateN:状态子类,实现VariableDataState接口,封装了特定某一类数据集合的操作,可以根据不同的数据集合定义多个VariableDataState接口的状态类,从而实现了对InvariableGUI的重用。

  本类型的实现代码在这里就不列出了,参照2.1.5节中的代码,很容易的就可实现本类型的结构。

  2.3 综合以上两种类型

  可以将以上两种类型结合起来使用,即实现了客户端软件的数据集合方面对GUI的重用,也实现了操作模式方面对GUI的重用。

  程序实现时,可以由GUI类分别维护一个ClientState的引用和一个VariableDataState的引用:

  初始化GUI类时,GUI的构造器调用ClientState对象的setComponents()方法设置控件的状态;

  用户提交操作时,GUI调用ClientState对象的action()方法,如图2所示,该方法使用传递的gui参数回调GUI的saveChangeToServer()方法,而saveChangeToServer()方法则按照图3所示,调用VariableDataState引用的状态对象的processData()方法完成数据操作。

  3 总结

  本文介绍的State模式应用于多类型数据、多操作模式的客户端软件,可以取得明显的效果;但如果客户端类和状态都很少时,使用本模式,反而增加了客户端类数量,增加了体系结构的复杂性,此时,可以使用继承方式的类体系来实现重用,无须使用State状态对象的委托操作和回调操作。

0
相关文章