GEF原理及实现系列(七、模型同步)

为了保证数据和展现的同步,必须要有一种消息通知机制,当模型被修改时通知相应的视图进行更新,下面将介绍如何实现这种消息机制。
1.模型同步的功能
    模型是GEF中实体,当模型的属性被修改后,控制器会监听到模型属性改变的事件,然后通知视图进行更新,模型和视图之间没有直接的联系,如下图:

    要通过事件的通知机制获得模型同步的步骤如下:
    (1)模型中包含注册监听器的机制,本文范例是通过PropertyChangeSupport和PropertyChangeListener机制添加模型监听器。
    (2)把控制器注册为模型监听器,在此通过控制器实现PropertyChangeListener接口,并把自己添加到模型的监听器即可。
    (3)当模型触发属性改变的事件后,控制器监听到事件并相应的更新视图。
        另外,并不是模型的所有属性的改变都必须通知控制器,一般情况下,当模型的属性更改后要引起视图的更新时,必须触发事件通知控制器,因为模型和视图之间没有    任何的关联。
2.模型同步的实现
    典型的模型对象会包含PropertyChangeSupport类型的成员变量,用来触发事件,通知监听器即控制器。当模型的属性被修改后,控制器将更 新视图的显示。例如,某个节点的名字修改后,将要触发相应的事件,通知控制器,如在前面提到的Node类中有如下片段:
java 代码
 
  1. public void setName(String name) {  
  2.         if (this.name.equals(name)) {  
  3.             return;  
  4.         }  
  5.         this.name = name;  
  6.         //当模型的名字改变后,通知监听器更新名字的显示  
  7.         firePropertyChange(PROP_NAME, null, name);  
  8.     }  

    当模型的名字改变后,将通过firePropertyChange方法触发模型名字被修改的事件,其中第一个参数为事件类型唯一标识,表示模型的什么属性被改变,第二个参数为改变钱的值,第三个参数为改变后的新值。
    模型触发事件后,控制器将监听到模型属性修改的事件,通知事件的类型,即firePropertyChange方法的第一个参数判断是哪一个属性被修改,然后执行相应的操作。下面是NodePart中相应的操作代码:
//监听模型属性改变
   
java 代码
 
  1. public void propertyChange(PropertyChangeEvent evt) {  
  2.         if (evt.getPropertyName().equals(Node.PROP_LOCATION))  
  3.             //更新视图  
  4.             refreshVisuals();  
  5.         else if (evt.getPropertyName().equals(Node.PROP_NAME))  
  6.             refreshVisuals();  
  7.         else if (evt.getPropertyName().equals(Node.PROP_INPUTS))  
  8.             //更新连接  
  9.             refreshTargetConnections();  
  10.         else if (evt.getPropertyName().equals(Node.PROP_OUTPUTS))  
  11.             refreshSourceConnections();  
  12.     }  

    当控制器监听到模型的改变事件后,将会通过视图的更新,从而实现了模型数据和视图显示的同步。

你可能感兴趣的:(同步)