在EMF中進行模型對象通知的時候,有時候不僅僅模型對象改變時需要得到通知,模型對象的子對象(通過Containment關系包含起來的)發(fā)生改變的時候,也希望能夠得到同樣的通知。簡單的實現(xiàn)方式可以創(chuàng)建一個Adapter,通過遞歸的方式將其注冊在這個模型對象樹的每一個節(jié)點對象上,但是那樣做比較復雜,要同時處理添加和刪除Adapter的工作。
在EMF中提供了變通的方式,可以使用EContentAdapter類來幫助完成這個任務。如下例所示:
public class ComponentAdapter extends EContentAdapter {
private Component component;
public void notifyChanged(Notification notification) {
super.notifyChanged(notification);
System.out.println(notification);
refresh();
}
public ComponentAdapter(Component component) {
component.eAdapters().add(this);
}
public void removeSelf() {
component.eAdapters().remove(this);
}
}
通過構造函數(shù)ComponentAdapter,可以將這個Adapter添加到Component這個模型對象上。當Component自身,或者Component的人和子孫節(jié)點發(fā)生改變的時候,notifyChanged都能被調(diào)用,處理接受通知的任務。
實際上EContentAdapter不僅僅能夠被添加到一個EObject上,還能夠被添加到Resource甚至ResourceSet上,它都能夠自動的把自身添加到每一個節(jié)點上,以響應事件,當其被刪除時,它也能夠自動的將其自身從每一個子節(jié)點上刪除。