Board logo

标题: State模式在客户端软件中的应用(2)客户端应用 [打印本页]

作者: look_wt    时间: 2018-10-15 18:44     标题: State模式在客户端软件中的应用(2)客户端应用

2. 客户端应用本模式的目标是分离客户端软件中的变化部分与不变部分,以使得变化的部分可独立于不变的部分,有利于扩充新的功能,也有利于维护。
在项目中,对于客户端GUI的重用有两种方式。
2.1 类型1: Read-Only & Normal2.1.1 动机
客户端GUI接受用户输入,经过数据有效性验证,然后将数据传输到服务端,服务端检查业务逻辑有效性,保存数据;但是在特定情况下(比如数据已经存在、且只能经历一次输入),依据客户端GUI所操作数据的状态,业务逻辑要求数据为只读,即客户端只具有显示数据的功能,并不能改变服务器上的数据。
一般地,编程实现时,会在GUI程序中加入判断数据是否应该为只读的逻辑判断语句。如果针对相同的数据集合(Model),有多个客户端GUI(View),就需要在每个程序中加入该判断。如此降低了程序的可维护性,决定数据是否为只读的这样一个业务逻辑将分散在程序中多处,不易维护,在业务逻辑发生改变时,易造成不一致。
我们可以将变化部分(在Normal和Read-Only状态下不同的部分)从GUI中抽取出来,分别用不同的类来表示,这样,当GUI的状态发生改变时,只需要改变其对状态对象的引用即可,状态相关操作委托给状态对象去完成。
2.1.2 适用性
本类型适用环境:相同数据集合,不同操作模式。即特定的GUI根据操作上下文环境,改变其响应模式,根据数据是否可编辑,分为两种状态Read-Only State、 Normal State。
2.1.3 结构(图2)
图2  相同数据集合,不同操作模式点击查看大图
2.1.4 参与者
2.1.5 代码示例
ClientStateChangeable接口:
1
2
3
4
5
6
7
8
9
10
11
12
public interface ClientStateChangeable {   
    /**
     * To get all changeable components in the GUI object.
     * @return Collection contains Component objects.
     */
    Collection getChageableComponents();
     
    /**
     * To save data to server.
     */
    void saveChangeToServer();
}




AClientGUI类:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
public class AClientGUI extends JPanel implements ClientStateChangeable{
    //…     
    private ClientState state = null;
public DesignStep1View(ClientState state){
//…         
this.state = state;
this.state.setComponents(this);
    }
     
    private void okButton_actionPerformed(ActionEvent e){
        state.action(this); //save data
    }
    public Collection getChageableComponents() {
        Collection dataComponents = new ArrayList();        
        dataComponents.add(jComboBoxESEPattern);
        //…         
        return dataComponents;
    }
    public void saveChangeToServer() {
        //…
    }
}




ClientState接口:
public interface ClientState {                /**         * To set components' state in the GUI.          * @param gui a GUI object which implements StateChangeable interface.         */        void setComponents(ClientStateChangeable gui);                /**         * when user click OK-Button in a GUI, the GUI will call this method.         * @param gui a GUI object which implements StateChangeable interface.         */        void action(ClientStateChangeable gui);}




欢迎光临 电子技术论坛_中国专业的电子工程师学习交流社区-中电网技术论坛 (http://bbs.eccn.com/) Powered by Discuz! 7.0.0