上文讲过观察者模式,尽管已经用了依赖倒转原则,但是"抽象通知者"还是依赖"抽象观察者",也就是说万一没有了抽象观察者这样的接口,通知的功能就完不成了。另一方面,每个具体观察者不一定是要调用"更新"方法。此时java利用反射即可实现,具体代码如下所示:

Event

package com.jdk8.event.javaEvent;

import java.lang.reflect.Method;

public class Event {

    //要执行方法的对象
private Object object; //要执行的方法名称
private String methodName; //要执行方法的参数
private Object[] params; //要执行方法的参数类型
private Class[] paramTypes; public Event(){ } public Event(Object object,String methodName,Object...args){
this.object = object;
this.methodName = methodName;
this.params = args;
contractParamTypes(this.params);
} //根据参数数组生成参数类型数组
private void contractParamTypes(Object[] params){
this.paramTypes = new Class[params.length];
for(int i=0;i<params.length;i++){
this.paramTypes[i] = params[i].getClass();
}
} /* 执行该对象的方法 */
public void invoke() throws Exception {
Method method = null;
method = object.getClass().getMethod(this.getMethodName(),this.getParamTypes());
method.invoke(this.getObject(),this.getParams());
} public Object getObject() {
return object;
} public void setObject(Object object) {
this.object = object;
} public String getMethodName() {
return methodName;
} public void setMethodName(String methodName) {
this.methodName = methodName;
} public Object[] getParams() {
return params;
} public void setParams(Object[] params) {
this.params = params;
} public Class[] getParamTypes() {
return paramTypes;
} public void setParamTypes(Class[] paramTypes) {
this.paramTypes = paramTypes;
}
}

EventHandler

package com.jdk8.event.javaEvent;

import java.util.ArrayList;
import java.util.List; public class EventHandler { private List<Event> objects; public EventHandler(){
objects = new ArrayList<>();
} //添加某个对象要执行的事件及需要的参数
public void addEvent(Object object,String methodName,Object...args){
objects.add(new Event(object,methodName,args));
} //通知所有的对象执行制定的事件
public void notifyX() {
for(Event e : objects){
try {
e.invoke();
} catch (Exception e1) {
e1.printStackTrace();
}
}
}
}

Notifier抽象类

package com.jdk8.event.javaEvent;

public abstract class Notifier {
private EventHandler eventHandler = new EventHandler(); public EventHandler getEnventHandler(){
return eventHandler;
} public void setEventHandler(EventHandler eventHandler){
this.eventHandler = eventHandler;
} //增加需要放哨的学生
public abstract void addListener(Object object,String methodname,Object...args); //告诉所有要帮忙放哨的学生:老师来了
public abstract void notifyX();
}

GoodNotifier

package com.jdk8.event.javaEvent;

public class GoodNotifier extends Notifier {

    @Override
public void addListener(Object object, String methodname, Object... args) {
System.out.println("有新的同学委托尽职尽责的放哨人!");
this.getEnventHandler().addEvent(object,methodname,args);
} @Override
public void notifyX() {
System.out.println("尽职尽责的放哨人告诉所有需要帮忙的同学:老师来了!");
try{
this.getEnventHandler().notifyX();
}catch (Exception e){
e.printStackTrace();
}
}
}

PlayingGameListener

package com.jdk8.event.javaEvent;

import java.util.Date;

public class PlayingGameListener {
public PlayingGameListener(){
System.out.println("我正在玩游戏,开始时间" + new Date());
} public void stopPlayingGame(Date date,String name){
System.out.println("老师来了,快回到座位上,结束时间"+date + " " + name);
}
}

WatchingTVListener

package com.jdk8.event.javaEvent;

import java.util.Date;

public class WatchingTVListener {
public WatchingTVListener(){
System.out.println("我正在看电视,开始时间" + new Date());
} public void stopWatchingTV(Date date){
System.out.println("老师来了,快回到座位上,结束时间"+date);
}
}

TestMain

package com.jdk8.event.javaEvent;

import java.util.Date;

public class TestMain {
public static void main(String[] args){
Notifier goodNotifier = new GoodNotifier();
PlayingGameListener playingGameListener = new PlayingGameListener();
WatchingTVListener watchingTVListener = new WatchingTVListener();
goodNotifier.addListener(playingGameListener,"stopPlayingGame",new Object[]{new Date(),new String()});
goodNotifier.addListener(watchingTVListener,"stopWatchingTV",new Date()); goodNotifier.notifyX();
}
}

java委托的更多相关文章

  1. 观察者模式和java委托

    观察者模式与java委托 所谓观察者模式,指的某个状态信息的改变,会影响其他一系列的操作,这时就可以将这些操作抽象化,同时创建一个类统一的管理和执行这些操作.把这些抽象出来的操作称为观察者类,而管理这 ...

  2. JAVA委托事件处理机制

    1)事件:用户对程序的某一种功能性操作. Java中的事件主要有两种: 1.组件类事件 componentEvent.ContainerEvent.WindowEvent.FocusEvent.Pai ...

  3. 转:java 委托

    委托模式是软件设计模式中的一项基本技巧.在委托模式中,有两个对象参与处理同一个请求,接受请求的对象将请求委托给另一个对象来处理.委托模式是一项基本技巧,许多其他的模式,如状态模式.策略模式.访问者模式 ...

  4. Mybatis上路_06-使用Java自动生成

    目录[-] 1.编写Generator执行配置文件: 2.在MyEclipse中建空web项目: 3.编写并执行Java程序: 4.查看并修改生成的文件: 5.测试,使用生成的文件查询: 1)导入My ...

  5. Mybatis上路_06-使用Java自动生成[转]

    Mybatis上路_06-使用Java自动生成 11人收藏此文章, 我要收藏发表于1个月前(2013-04-24 23:05) , 已有151次阅读 ,共0个评论 目录:[ - ] 1.编写Gener ...

  6. Java动态代理探讨

    代理模式: 代理模式是常用的java设计模式,他的特征是代理类与委托类有同样的接口,代理类主要负责为委托类预处理消息.过滤消息.把消息转发给委托类,以及事后处理消息等.通过代理模式,可以延迟创建对象, ...

  7. Mybatis上路_05-使用命令行自动生成

    http://my.oschina.net/vigiles/blog/125127 目录[-] 1.数据准备: 1)建库: 2)建表: 3)预设数据: 2.编写Generator执行配置文件: 3.搭 ...

  8. Mybatis上路_05-使用命令行自动生成【转】

    http://my.oschina.net/vigiles/blog/125127 Mybatis上路_05-使用命令行自动生成   1人收藏此文章, 我要收藏 发表于1个月前(2013-04-24 ...

  9. Flowable实战(八)BPMN2.0 任务

      任务是流程中最重要的组成部分.Flowable提供了多种任务类型,以满足实际需求.   常用任务类型有: 用户任务 Java Service任务 脚本任务 业务规则任务 执行监听器 任务监听器 多 ...

随机推荐

  1. Java泛型相关总结(下)

    约束与局限性 不能用基本类型实例化类型参数 不能像Pair<double>这样调用,只能Pair<Double>,原因是类型擦除 运行时类型查询只使用于原始类型 虚拟机中的对象 ...

  2. jQuery: 判断from表单是否修改

    <script> $(function() { $("#myform :input").change(function(){ $("#myform" ...

  3. 关于sql 索引

    1.聚集索引一个表只能有一个,而非聚集索引有个表能有多个 2.聚集索引和非聚集索引的根本区别是表记录的排列顺序和与索引的排列顺序是否一致,其实理解起来非常简单,还是举字典的例子:如果按照拼音查询,那么 ...

  4. 浏览器端使用javascript调用腾讯翻译api

    最近在学习的小玩意,发现腾讯的文档十分坑爹,里面有很多错误的指示. 不过腾讯的机器翻译还是很牛的,我觉得翻译水准比谷歌好很多. 腾讯的机器翻译貌似在试用阶段,不收费,用QQ或微信登录即可申请使用. 首 ...

  5. 你真的理解了for循环吗?反正我是没有

    for循环的执行步骤 咱们先来看一个有意思的关于for循环的程序 public class TestFor { public static void main(String[] args) { int ...

  6. InetSim配置使用

    参考网址: http://techanarchy.net/2013/08/installing-and-configuring-inetsim/ https://blog.csdn.net/isins ...

  7. Linux安装python3.6

    Linux安装python3.6  原地址:https://www.cnblogs.com/kimyeee/p/7250560.html Linux下安装Python3.6和第三方库   如果本机安装 ...

  8. Hbase的集群安装

    hadoop集群的搭建 搭建真正的zookeeper集群 Hbase需要安装在成功部署的Hadoop平台,并且要求Hadoop已经正常启动. 同时,HBase需要集群部署,我们分别把HBase 部署到 ...

  9. 《深度探索C++对象模型》读书笔记(二)

    第三章:Data语意学 这一章主要讲了类中的数据在内存中是如何分配的,包括(多重)继承和多态. 让我们首先从一段代码开始: class X{}; class Y :virtual public X{} ...

  10. java中抽象类是否可以继承实体类?

    一道java 常见面试题,网上找到的几乎每个 java 面试笔试题大全或集锦里都能找到这道题. 题目如下:问: 抽象类是否可继承实体类 (concrete class) 答: 抽象类是可以继承实体类, ...