Modo de observador de eventos de cambio de propiedad en Jface

Modo de observador de eventos de cambio de propiedad en Jface

1. Las clases involucradas en el patrón

org.eclipse.jface.util.IPropertyChangeListener; (interfaz)
org.eclipse.jface.util.PropertyChangeEvent; (clase)

2. Diagrama de clases

Inserte la descripción de la imagen aquí

3. Cómo utilizar

3.1. Definir un gerente

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. Definir productor de eventos 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. Definir productor de eventos 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. Definir el consumidor de eventos 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. Definir el consumidor de eventos 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. Rutina de prueba

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. Resultados en ejecución

-----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. Descripción

En comparación con los métodos Sujeto y Observador del modo de observador jdk,
(1) Admite múltiples desencadenantes de eventos;
(2) Admite situaciones en las que es imposible o inconveniente establecer la relación entre observadores y generadores de eventos en el mismo lugar;

Supongo que te gusta

Origin blog.csdn.net/skytering/article/details/100545808
Recomendado
Clasificación