【EMF】通知机制

239 阅读2分钟

EMF通知机制

EMF(Eclipse Modeling Framework)是一个强大的建模框架,其中包含了用于创建和管理模型的工具和库。EMF提供了一种通知机制,使得当模型发生变化时,能够及时通知相关的观察者。这种通知机制对于实现模型-视图-控制器(MVC)架构以及其他需要实时更新的应用程序非常有用。

EMF通知机制概述

EMF的通知机制基于观察者模式,其中包括以下主要组件:

  • 被观察者(Observable):即模型对象,当其状态发生变化时,会通知注册的观察者。

  • 观察者(Observer):监听被观察者的变化,一旦变化发生,观察者会收到通知并执行相应的操作。

  • EContentAdapter:是一种特殊的观察者,专门用于监听模型内容的变化,它可以监听模型树的任何部分,并在发生变化时通知相关的观察者。

EMF通知机制示例

下面是一个简单的Java代码示例,演示了如何在EMF中使用通知机制:

import org.eclipse.emf.common.notify.Notification;
import org.eclipse.emf.common.notify.impl.AdapterImpl;
import org.eclipse.emf.common.notify.impl.NotificationImpl;
import org.eclipse.emf.ecore.util.EContentAdapter;

// 被观察者类
class MyModel {
    private String data;
    private EContentAdapter contentAdapter;

    public MyModel() {
        data = "Initial Data";
        contentAdapter = new EContentAdapter() {
            @Override
            public void notifyChanged(Notification notification) {
                if (notification.getEventType() == Notification.SET) {
                    System.out.println("Model content changed: " + notification.getNewValue());
                }
            }
        };
    }

    public void setData(String newData) {
        if (!data.equals(newData)) {
            this.data = newData;
            // 发送通知
            fireNotification();
        }
    }

    public String getData() {
        return data;
    }

    private void fireNotification() {
        // 创建一个通知对象
        Notification notification = new NotificationImpl(Notification.SET, null, data);
        // 通知注册的观察者
        contentAdapter.notifyChanged(notification);
    }

    public EContentAdapter getContentAdapter() {
        return contentAdapter;
    }
}

public class EMFNotificationExample {
    public static void main(String[] args) {
        MyModel model = new MyModel();
        
        // 获取内容观察者并注册
        EContentAdapter contentAdapter = model.getContentAdapter();
        model.getContentAdapter().addAdapter(contentAdapter);
        
        // 模拟数据变化并触发通知
        model.setData("New Data");
    }
}

在这个示例中,MyModel是一个被观察者类,它包含了一个EContentAdapter作为内容观察者。EContentAdapter重写了notifyChanged()方法,以便在模型内容发生变化时收到通知。在EMFNotificationExample中,我们创建了一个MyModel对象,并注册了它的内容观察者。然后,通过调用setData()方法改变数据,内容观察者会收到相应的通知并执行相应的操作。

总结

EMF的通知机制是一种强大的工具,可用于实现模型的实时更新和与视图的同步。通过将内容观察者注册到被观察者,并在内容发生变化时发送通知,可以实现模型与视图的解耦合,从而提高了代码的灵活性和可维护性。 EContentAdapter的使用使得对于模型树的任何部分的变化都可以被观察到,进一步增强了通知机制的灵活性。