首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

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

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()方法完成数据操作。
返回列表