java 通用事件回调类(观察者队列)
//文件名 CCommonDelegate.java
//作者 龙远智 @imo云办公室
//邮件 lyzlyz_2004@126.com
//时间 2014.Aug.5
//功能 委托库 CCommonDelegate
//声明 您可以自由使用和修改本函数库,但请保留本文件头
package com.imo.base;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.LinkedList;
import java.util.Iterator;
public class CCommonDelegate {
private Class<?>[] paramsType=null;
private class InnStruct<T>
{
public Method m_mthod = null;
public T m_objRef = null;
private Class<?> classzz=null;
InnStruct(T o, Method m)
{
classzz = o.getClass();
m_mthod = m;
m_objRef = o;
}
}
LinkedList<InnStruct<?>> m_lsObservers = new LinkedList<InnStruct<?>>();
public CCommonDelegate(Class<?>[] paramsType)
{
this.paramsType=paramsType;
}
public <T> boolean Bind(T o, String sMethodName)
{
assert(paramsType != null);
if(hasBind(o))
return true;
Method m = null;
try
{
m = o.getClass().getMethod(sMethodName, paramsType);
}
catch(NoSuchMethodException e)
{
e.printStackTrace();
return false;
}
catch(SecurityException e)
{
e.printStackTrace();
return false;
}
InnStruct<T> obj = new InnStruct<T>(o, m);
synchronized(this)
{
m_lsObservers.add(obj);
}
return true;
}
public boolean hasBind(Object o)
{
synchronized(this)
{
Iterator<InnStruct<?>> it = m_lsObservers.iterator();
for(; it.hasNext();)
{
if(it.next().m_objRef == o)
{
return true;
}
}
return false;
}
}
public void UnBind(Object o)
{
synchronized(this)
{
Iterator<InnStruct<?>> it = m_lsObservers.iterator();
for(; it.hasNext();)
{
if(it.next().m_objRef == o)
{
it.remove();
return;
}
}
}
}
public void clear()
{
synchronized(this)
{
m_lsObservers.clear();
}
}
public void invoke(Object... params) throws NoSuchMethodException, IllegalAccessException, IllegalArgumentException, InvocationTargetException
{
boolean bEqual = arrayContentsEq(paramsType, params, false);
if(!bEqual)
{
CheckParamTypesError(params);
}
CallObservers(params);
}
public void invokeWithSubClassTolerant(Object... params) throws NoSuchMethodException, IllegalAccessException, IllegalArgumentException, InvocationTargetException
{
boolean bEqual = arrayContentsEq(paramsType, params, true);
if(!bEqual)
{
CheckParamTypesError(params);
}
CallObservers(params);
}
private void CheckParamTypesError(Object... params) throws IllegalArgumentException
{
StringBuffer sDesc = new StringBuffer("CCommonDelegate invoke paramters type mismatch, expect:(");
int i=0;
for(i=0;i<paramsType.length;++i)
{
sDesc.append(paramsType[i].getName()).append(",");
}
sDesc.append("), but get:(");
for(i=0;i<params.length;++i)
{
sDesc.append(params[i].getClass().getName()).append(",");
}
sDesc.append(")");
throw new IllegalArgumentException(sDesc.toString());
}
private void CallObservers(Object... params) throws NoSuchMethodException, IllegalAccessException, IllegalArgumentException, InvocationTargetException
{
LinkedList<InnStruct<?>> oListTmp = null;
synchronized(this)
{
oListTmp = new LinkedList<InnStruct<?>>(m_lsObservers);
}
for(InnStruct<?> oRef:oListTmp)
{
oRef.m_mthod.invoke(oRef.m_objRef, params);
}
oListTmp.clear();
oListTmp = null;
}
private static boolean arrayContentsEq(Class<?>[] a1, Object[] a2, boolean bSubClassTolerant)
{
if (a1 == null)
{
return a2 == null || a2.length == 0;
}
if (a2 == null)
{
return a1.length == 0;
}
if (a1.length != a2.length)
{
return false;
}
for (int i = 0; i < a1.length; i++)
{
if(bSubClassTolerant)
{
if (a2[i] != null && !a1[i].isInstance(a2[i]))
{
return false;
}
}
else
{
if (a2[i] != null && a1[i] != a2[i].getClass())
{
return false;
}
}
}
return true;
}
}
使用:
class A
{
public CCommonDelegate evt_OnNetWorkException = new CCommonDelegate(new Class<?>[]{Integer.class});
private void func
{
evt_OnNetWorkException.invoke(1);
}
}
class B
{
public void onNetworkException(Integer nErrcode)
{
......
}
public B(A objA)
{
objA.evt_OnNetWorkException.Bind(this, "onNetworkException");
}
}
java 通用事件回调类(观察者队列)相关推荐
- java监听机制_详解java的事件监听机制和观察者设计模式
首先说说监听器: 监听器就是一个实现特定接口的普通java程序,这个程序专门用于监听另一个java对象的方法调用或属性改变,当被监听对象发生上述事件后,监听器某个方法将立即被执 行. java的事件监 ...
- C语言 串口通知消息,编程模式·观察者模式、事件通知、消息队列三者区别
观察者模式.事件通知.消息队列三者有类似,都有回调函数注册,通知调用的设计,容易混淆. 简述和区别 观察者模式:被观察对象状态改变,所有观察它的对象得到通知.也称订阅模式,英文Observer. 被观 ...
- java委托事件模型_JAVA授权事件模型讲解(原创)
JAVA的授权事件模型包含三个概念:事件源,事件,事件监听器. 一,事件源:一个产生事件的对象.当这个对象的内部状态改变时,事件就会产生.一个事件源必须注册一个事件监听器已使监听器能够可以接受一个特定 ...
- java通用象棋游戏_在通用国际象棋界面周围模拟GraphQL包装器
java通用象棋游戏 The Universal Chess Interface (UCI) has been around a long time and used by many chess en ...
- java多线程之:SynchronousQueue队列
转载自 java多线程之:SynchronousQueue队列 SynchronousQueue是这样一种阻塞队列,其中每个 put 必须等待一个 take,反之亦然.同步队列没有任何内部容量,甚至 ...
- Java中事件监听机制
Java中事件监听机制 一.事件监听机制的定义 要想了解Java中的事件监听机制,首先就要去了解一下在Java中事件是怎样去定义的呢!在使用Java编写好一个界面后,我们就会对界面进行一些操作,比如, ...
- 【Android 高性能音频】Oboe 开发流程 ( 包含头 Oboe 头文件 | 创建音频流 | 设置音频流 | 音频流回调类 AudioStreamCallback )
文章目录 一.包含头 Oboe 头文件 二.音频流构建器 AudioStreamBuilder 三.音频流回调 AudioStreamCallback Oboe GitHub 主页 : GitHub/ ...
- Java线程详解(15)-阻塞队列和阻塞栈
Java线程:新特征-阻塞队列 阻塞队列是Java5线程新特征中的内容,Java定义了阻塞队列的接口java.util.concurrent.BlockingQueue,阻塞队列的概念是,一个指定长度 ...
- java实现分发_关于JAVA中事件分发和监听机制实现的代码实例
[实例简介] 关于JAVA中事件分发和监听机制实现的代码实例,绝对实用代码,有说明. [实例截图] [核心代码] JavaEventDispatch ├── bin │ └── com │ └ ...
- JavaScript判断设备类型加载对应网页并设置两端通用事件
JavaScript如何判断设备类型加载对应网页并设置通用事件 基本思路: 在网页入口添加判断逻辑,如下:首先获取当前navigator对象的userAgent,通过userAgent判断当前设备类型 ...
最新文章
- segMatch:基于3D点云分割的回环检测
- Intel Realsense 官方案例源码地址
- 段错误调试神器 - Core Dump详解
- 甲骨文中国疯狂裁员 招聘网站上线“甲骨文人才专场”
- 计算机基础e卷,大学计算机基础(e卷).doc
- 超大背包问题(二进制枚举 + 二分)
- 计算机服务器机房设计方案,机房设计方案.pdf
- 单片机指令系统(1)
- html之设置页面ico图标ie浏览器,如何修改网页小图标,浏览器页面上的图标(favicon.ico)...
- 依赖注入是什么?Go是如何实现依赖注入的?
- Windows 安装 MySQL 8 zip版安装,及Windows MySQL多实例
- 分区助手各版本比较(图文详解)
- SD卡读卡程序 C语言 IO模拟,单片机SD卡读卡器仿真+源程序+电路原理图
- ST-Link SWD接口接线
- Python爬虫突然提取不出信息了,返回的是空列表的解决办法
- 个人附加作业 201421123108 王坤彬 网络1414
- html清理超链接前面的黑点,吹毛求疵:解决IE6-7给链接加黑点边框的三种方案
- 一个立体仓库无线网络故障诊断分析案例
- 全国计算机一级课件,2017全国计算机一级考试习题及答案课件.doc
- 海康工业相机两种打开方式
热门文章
- 【剑指offer】JZ55 二叉树的深度 python
- Java工程师成神之路(2020最新版)
- 未来的计算机将是半导体,硅的未来岌岌可危?未来计算机或迎来钻石芯
- 网络推广行业拓客的10个经典方法
- 最近爆火的DDD到底是什么?一文带你落地DDD
- 参照系(参考系)与参照物的区别
- docker mysql 修改cnf_Docker下Mysql .cnf文件修改小贴士
- XJTU 新闻英语阅读unit1作业答案
- pixi.js 5.0_使用Pixi.js进行高级绘图
- python 006 __ 小斌文档 | 特殊字符的使用