jdk中的UI事件模型使用的是发布订阅模式,但是jdk也提供了观察者模式的支持,对于名字上的区别可能发现不了什么东东,为什么UI事件模型用的是发布订阅模式而非观察者模式,在参考了一些网上的文章后明白了一点,现记录下。
先来看看jdk中ui事件模型的理论代码(参考jdk写的):
package design.eventListener2;
/**
* @author 作者 E-mail: jqsl2012@163.com
* @version 创建时间:2012-1-4 上午10:51:36 <br>
*
*/
public class Test {
public static void main(String[] args) {
AbstractButton btn = new AbstractButton();
//添加事件
btn.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
System.out.println("button event");
System.out.println("事件源:"+e.getSource());
}
});
//手动触发事件
btn.fireActionListener(null);
/*
* 订阅发布模式
* jdk中的UI事件模型其实就是订阅发布模式,与订阅发布模式相似的还有一个模式是
* 观察者模式,为什么不用观察者模式我想可能是基于2个方面的考虑:
* 1、观察者模式是基于观察者和被观察者2个对象来考虑的,而UI控件兼具观察者和被观察者两种角色
* 2、JDK提供的Observer这个现成的观察者模式的update方法把名字限定死了,
* UI事件各有各的名字限定死肯定是不合理的
*/
}
}
package design.eventListener2;
/**
* @author 作者 E-mail: jqsl2012@163.com
* @version 创建时间:2012-1-4 上午10:34:38 <br>
*
*/
public class AbstractButton {
EventListenerList listener = new EventListenerList();
//订阅
public void addActionListener(ActionListener e) {
listener.addActionListener(e);
}
//发布
public void fireActionListener(ActionEvent e) {
for (int i = 0; i < listener.getListener().size(); i++) {
ActionEvent source = new ActionEvent(AbstractButton.this);
listener.getListener().get(i).actionPerformed(source);
}
}
// class Handler implements ActionListener {
//
// public void actionPerformed(ActionEvent e) {
// fireActionListener(e);
// }
// }
}
package design.eventListener2;
import java.util.EventListener;
/**
* @author 作者 E-mail: jqsl2012@163.com
* @version 创建时间:2012-1-4 上午10:35:55 <br>
*
*/
public interface ActionListener extends EventListener {
void actionPerformed(ActionEvent e);
}
package design.eventListener2;
import java.util.Vector;
/**
* @author 作者 E-mail: jqsl2012@163.com
* @version 创建时间:2012-1-4 上午10:38:34 <br>
*
*/
public class EventListenerList {
private Vector<ActionListener> listener = new Vector<ActionListener>();
public Vector<ActionListener> getListener() {
return listener;
}
public void addActionListener(ActionListener e) {
listener.add(e);
}
}
package design.eventListener2;
import java.util.EventObject;
/**
* @author 作者 E-mail: jqsl2012@163.com
* @version 创建时间:2012-1-4 上午10:36:58 <br>
*
*/
public class ActionEvent extends EventObject {
public ActionEvent(Object source) {
super(source);
// System.out.println(source + "触发了");
}
}
毫无疑问这样的设计是good的,但是用观察者模式来对ui事件模型进行设计会是个什么样子的呢?
package design.uiObserver;
import java.util.Observable;
/**
* @author 作者 E-mail: jqsl2012@163.com
* @version 创建时间:2012-1-28 下午10:32:25 <br>
*
*/
public class Test {
public static void main(String[] args) {
AbstractButton btn = new AbstractButton();
btn.addObserver(btn);//注册click事件
//模拟触发事件
btn.setChanged();//被观察者已经改变
btn.notifyObservers();//通知观察者被观察者已经改变
/*
* 观察者模式去实现UI的事件模型,由于UI控件模型具有双重的性质,
* 即是观察者也是被观察者,而JDK的观察者模式中,观察者必须实现Observer接口,
* 被观察者必须继承Observable类,但是UI控件不能这样来设计
* AbstractButton extends Observable implements java.util.Observer
*/
}
}
package design.uiObserver;
import java.util.Observable;
/**
* @author 作者 E-mail: jqsl2012@163.com
* @version 创建时间:2012-1-28 下午10:31:24 <br>
*
*/
public class AbstractButton extends Observable implements java.util.Observer{
public void update(Observable o, Object arg) {
System.out.println("update:"+o);
}
@Override
protected synchronized void setChanged() {
super.setChanged();
}
}
分享到:
相关推荐
java UI
一个用JAVA写的模拟手机的UI程序,适合初学者参考。
Java开发_qq_UI界面素材
基于JAVA Applet设计的QQ,拥有登陆界面,后台服务器管理等纵多功能,可实现多人聊天。
BlackBerry_Java_SDK-UI 快速指南.pdf 6.0 中文
PQ、PM分区工具中提示缺少hdmdlg_mount.ui 系统分区后无法创建盘符吗?
Smali2JavaUI apk反编译神器 Smali2JavaUI Smali2Java apk apktool 反编译 逆向工程 工具
java swing实现的打印和打印预览功能,调用本地打印机打印预览效果的图纸
A j2me ui and time A j2me ui and time
一个简易的躲避子弹飞机小游戏,基于最简单的java ui 一个简易的躲避子弹飞机小游戏,基于最简单的java ui 一个简易的躲避子弹飞机小游戏,基于最简单的java ui 一个简易的躲避子弹飞机小游戏,基于最简单的java ui ...
已订阅专栏的用户可以直接找博主获取 ...当涉及Unity中的MVC(Model-View-Controller)架构时,观察者模式实际上与MVC的概念非常相似。...您可以在MVC框架中使用观察者模式来实现数据更新和UI刷新的解耦。
使用LigerUI的Grid和Java的Json实现数据显示
JFtp是一个用 Java编写的图形化的FTP客户端程序。它支持所有基本的FTP操作,有一些改善的性能,如递归式目录上传,漂亮的swing UI,能够自动断点续传,能识别...API从GUI中分离,可以用于第三方应用程序或命令行模式。
自制JAVAUI小程序2048,课设可用
EX_UI界面库201702.27版EX_UI界面库201702.27版EX_UI界面库201702.27版EX_UI界面库201702.27版EX_UI界面库201702.27版EX_UI界面库201702.27版EX_UI界面库201702.27版EX_UI界面库201702.27版EX_UI界面库201702.27版EX...
基于JavaUI代理的图形用户界面设计模式.pdf
java ui课件 简单的ui基础,初学者可以看一哈 主要为swing
UI设计 [UI参考]_游戏界面UI设计素材 [UI参考]_游戏界面UI设计素材 [UI参考]_游戏界面UI设计素材
stable diffusion webui lora模型 国风露肩汉服_v1.0 stable diffusion webui lora模型 国风露肩汉服_v1.0 stable diffusion webui lora模型 国风露肩汉服_v1.0 stable diffusion webui lora模型 国风露肩汉服_v1.0 ...
Smali2JavaUI,是一个反编译软件,使用起来简单方便。