Jface中的属性改变事件观察者模式

3 篇文章 1 订阅
1 篇文章 0 订阅

Jface中的属性改变事件观察者模式

1.模式涉及的类

org.eclipse.jface.util.IPropertyChangeListener; (接口)
org.eclipse.jface.util.PropertyChangeEvent;(类)

2.类图

在这里插入图片描述

3.使用方式

3.1.定义一个管理器

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.定义事件生产者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.定义事件生产者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.定义事件消费者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.定义事件消费者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.测试例程

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.运行结果

-----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.说明

相对jdk的观察者模式的Subject和Observer方式,
(1)支持多事件触发者;
(2)支持无法或者不方便在同一处设置观察者和事件产生者关联关系的情况;

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值