State模式在客户端软件中的应用(2)客户端应用更新

- UID
- 1072456
|

State模式在客户端软件中的应用(2)客户端应用更新
ClientNormalState类:
1
2
3
4
5
6
7
8
9
10
11
12
| public class ClientNormalState implements ClientState {
/**
* 正常状态下, 各个控件默认为可编辑的, 所以不用做任何更改
*/
public void setComponents(ClientStateChangeable gui) {}
/**
* 正常状态下, 需要将用户所作修改保存到服务端
*/
public void action(ClientStateChangeable gui) {
gui.saveChangeToServer();
}
}
|
ClientReadOnlyState类:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
| public class ClientReadOnlyState implements ClientState {
/**
* 设置GUI的数据控件为Read-Only
*/
public void setComponents(ClientStateChangeable gui) {
Collection components = gui.getChageableComponents();
Iterator iter = components.iterator();
while(iter.hasNext()){
JComponent jc = (JComponent)iter.next();
jc.setEnabled(false);
String toolTip = jc.getToolTipText();
String addedTip = "只读状态";
if(toolTip == null)toolTip = addedTip;
else toolTip += ". " + addedTip;
jc.setToolTipText(toolTip);
}
}
/**
* GUI处于Read-Only状态, 无需将数据保存到server端
*/
public void action(ClientStateChangeable gui) {}
}
|
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()方法完成数据操作。
|
|
|
|
|
|