Property change event observer mode in Jface

Property change event observer mode in Jface

1. The classes involved in the pattern

org.eclipse.jface.util.IPropertyChangeListener; (interface)
org.eclipse.jface.util.PropertyChangeEvent; (class)

2. Class diagram

Insert picture description here

3. How to use

3.1. Define a manager

import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;

import org.eclipse.jface.util.IPropertyChangeListener;
import org.eclipse.jface.util.PropertyChangeEvent;

public class ValuePropertChangeManager {
    
    
	private static ValuePropertChangeManager INSTANCE;

	private static final Map<String, IPropertyChangeListener> map = new HashMap<String, IPropertyChangeListener>();

	private ValuePropertChangeManager(){
    
    
	 
	}

	public static ValuePropertChangeManager getInstance() {
    
    
		if(INSTANCE==null)
			INSTANCE = new ValuePropertChangeManager();
		return INSTANCE;
	}

	// 触发属性改变监听事件
	public void firePropertyChangeListener(PropertyChangeEvent event) {
    
    
		final Iterator iter = map.keySet().iterator();
		while (iter.hasNext()) {
    
    
			map.get(iter.next()).propertyChange(event);
		}
	}

	// 注册属性改变监听器
	public void addPropertyChangeListener(final String listenerID,
			final IPropertyChangeListener listener) {
    
    
		if (!map.containsKey(listenerID))
			map.put(listenerID, listener);
	}

	// 注销属性改变监听器
	public void removePropertyChangeListener(final String listenerID) {
    
    
		if (map.containsKey(listenerID))
			map.remove(listenerID);
	}
}

3.2. Define event producer A

import org.eclipse.jface.util.PropertyChangeEvent;
 

public class MyPropertyProviderA {
    
    
	private String myValue; 
	public void setValue(String curValue){
    
    
		String oldValue = myValue;
		myValue = curValue;
		ValuePropertChangeManager.getInstance()
		.firePropertyChangeListener(new PropertyChangeEvent(this, "myValue", oldValue, myValue));
	}
}

3.3. Define event producer B

import org.eclipse.jface.util.PropertyChangeEvent;
 

public class MyPropertyProviderB {
    
    
	private String myValue; 
	public void setValue(String curValue){
    
    
		String oldValue = myValue;
		myValue = curValue;
		ValuePropertChangeManager.getInstance()
		.firePropertyChangeListener(new PropertyChangeEvent(this, "myValue", oldValue, myValue));
	}
}

3.4. Define event consumer A

import org.eclipse.jface.util.IPropertyChangeListener;
import org.eclipse.jface.util.PropertyChangeEvent;

public class MyPropertyOberverA implements IPropertyChangeListener{
    
    
	public void registerMyValueChange(){
    
    
		ValuePropertChangeManager.getInstance()
		.addPropertyChangeListener("MyPropertyOberverA", this);
	}

	@Override
	public void propertyChange(PropertyChangeEvent event) {
    
    
		// TODO Auto-generated method stub
		System.out.println("-----MyPropertyOberverA do for propertyChange-----");
		System.out.println("source class="+event.getSource().getClass());
		System.out.println("Property="+event.getProperty());
		System.out.println("old value="+event.getOldValue());
		System.out.println("new value="+event.getNewValue());
	}
}

3.5. Define event consumer B

import org.eclipse.jface.util.IPropertyChangeListener;
import org.eclipse.jface.util.PropertyChangeEvent;
 

public class MyPropertyOberverB implements IPropertyChangeListener{
    
    
	public void registerMyValueChange(){
    
    
		ValuePropertChangeManager.getInstance()
		.addPropertyChangeListener("MyPropertyOberverB", this);
	}

	@Override
	public void propertyChange(PropertyChangeEvent event) {
    
    
		// TODO Auto-generated method stub
		System.out.println("-----MyPropertyOberverB do for propertyChange-----");
		System.out.println("source class="+event.getSource().getClass());
		System.out.println("Property="+event.getProperty());
		System.out.println("old value="+event.getOldValue());
		System.out.println("new value="+event.getNewValue());
	}
}

3.6. Test routine

public class Test {
    
    

	public static void main(String[] args) {
    
    
		// TODO Auto-generated method stub
		MyPropertyOberverA poa = new MyPropertyOberverA();
		poa.registerMyValueChange();
		MyPropertyOberverB pob = new MyPropertyOberverB();
		pob.registerMyValueChange();
		MyPropertyProviderA ppa = new MyPropertyProviderA();
		ppa.setValue("value 1");
		MyPropertyProviderB ppb = new MyPropertyProviderB();
		ppb.setValue("value 0.618");
		
	}

}

3.7. Running results

-----MyPropertyOberverB do for propertyChange-----
source class=class com.tyde.jfcs.ui.test.MyPropertyProviderA
Property=myValue
old value=null
new value=value 1
-----MyPropertyOberverA do for propertyChange-----
source class=class com.tyde.jfcs.ui.test.MyPropertyProviderA
Property=myValue
old value=null
new value=value 1
-----MyPropertyOberverB do for propertyChange-----
source class=class com.tyde.jfcs.ui.test.MyPropertyProviderB
Property=myValue
old value=null
new value=value 0.618
-----MyPropertyOberverA do for propertyChange-----
source class=class com.tyde.jfcs.ui.test.MyPropertyProviderB
Property=myValue
old value=null
new value=value 0.618

4. Description

Compared with the Subject and Observer methods of jdk observer mode,
(1) Support multiple event triggers;
(2) Support situations where it is impossible or inconvenient to set the relationship between observers and event generators at the same place;

Guess you like

Origin blog.csdn.net/skytering/article/details/100545808