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

2024-01-07 16:18

本文主要是介绍Jface中的属性改变事件观察者模式,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

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);}@Overridepublic void propertyChange(PropertyChangeEvent event) {// TODO Auto-generated method stubSystem.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);}@Overridepublic void propertyChange(PropertyChangeEvent event) {// TODO Auto-generated method stubSystem.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 stubMyPropertyOberverA 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)支持无法或者不方便在同一处设置观察者和事件产生者关联关系的情况;

这篇关于Jface中的属性改变事件观察者模式的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/580522

相关文章

Spring Security基于数据库的ABAC属性权限模型实战开发教程

《SpringSecurity基于数据库的ABAC属性权限模型实战开发教程》:本文主要介绍SpringSecurity基于数据库的ABAC属性权限模型实战开发教程,本文给大家介绍的非常详细,对大... 目录1. 前言2. 权限决策依据RBACABAC综合对比3. 数据库表结构说明4. 实战开始5. MyBA

CSS will-change 属性示例详解

《CSSwill-change属性示例详解》will-change是一个CSS属性,用于告诉浏览器某个元素在未来可能会发生哪些变化,本文给大家介绍CSSwill-change属性详解,感... will-change 是一个 css 属性,用于告诉浏览器某个元素在未来可能会发生哪些变化。这可以帮助浏览器优化

Linux系统配置NAT网络模式的详细步骤(附图文)

《Linux系统配置NAT网络模式的详细步骤(附图文)》本文详细指导如何在VMware环境下配置NAT网络模式,包括设置主机和虚拟机的IP地址、网关,以及针对Linux和Windows系统的具体步骤,... 目录一、配置NAT网络模式二、设置虚拟机交换机网关2.1 打开虚拟机2.2 管理员授权2.3 设置子

C#如何动态创建Label,及动态label事件

《C#如何动态创建Label,及动态label事件》:本文主要介绍C#如何动态创建Label,及动态label事件,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录C#如何动态创建Label,及动态label事件第一点:switch中的生成我们的label事件接着,

SpringBoot如何通过Map实现策略模式

《SpringBoot如何通过Map实现策略模式》策略模式是一种行为设计模式,它允许在运行时选择算法的行为,在Spring框架中,我们可以利用@Resource注解和Map集合来优雅地实现策略模式,这... 目录前言底层机制解析Spring的集合类型自动装配@Resource注解的行为实现原理使用直接使用M

浅析CSS 中z - index属性的作用及在什么情况下会失效

《浅析CSS中z-index属性的作用及在什么情况下会失效》z-index属性用于控制元素的堆叠顺序,值越大,元素越显示在上层,它需要元素具有定位属性(如relative、absolute、fi... 目录1. z-index 属性的作用2. z-index 失效的情况2.1 元素没有定位属性2.2 元素处

C#原型模式之如何通过克隆对象来优化创建过程

《C#原型模式之如何通过克隆对象来优化创建过程》原型模式是一种创建型设计模式,通过克隆现有对象来创建新对象,避免重复的创建成本和复杂的初始化过程,它适用于对象创建过程复杂、需要大量相似对象或避免重复初... 目录什么是原型模式?原型模式的工作原理C#中如何实现原型模式?1. 定义原型接口2. 实现原型接口3

大数据spark3.5安装部署之local模式详解

《大数据spark3.5安装部署之local模式详解》本文介绍了如何在本地模式下安装和配置Spark,并展示了如何使用SparkShell进行基本的数据处理操作,同时,还介绍了如何通过Spark-su... 目录下载上传解压配置jdk解压配置环境变量启动查看交互操作命令行提交应用spark,一个数据处理框架

HTML5 data-*自定义数据属性的示例代码

《HTML5data-*自定义数据属性的示例代码》HTML5的自定义数据属性(data-*)提供了一种标准化的方法在HTML元素上存储额外信息,可以通过JavaScript访问、修改和在CSS中使用... 目录引言基本概念使用自定义数据属性1. 在 html 中定义2. 通过 JavaScript 访问3.

CSS模拟 html 的 title 属性(鼠标悬浮显示提示文字效果)

《CSS模拟html的title属性(鼠标悬浮显示提示文字效果)》:本文主要介绍了如何使用CSS模拟HTML的title属性,通过鼠标悬浮显示提示文字效果,通过设置`.tipBox`和`.tipBox.tipContent`的样式,实现了提示内容的隐藏和显示,详细内容请阅读本文,希望能对你有所帮助... 效