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();
}
}
分享到:
相关推荐
观察者模式是软件设计模式中的一种行为模式,它在Android开发中被广泛应用,尤其是在处理事件响应和组件间的通信。这个模式允许对象订阅另一个对象的状态变化,当被观察的对象发生改变时,所有订阅者都会被通知并...
这一模式在Java中得到了很好的实现,Java的`java.util.Observable`类和`java.util.Observer`接口就是观察者模式的具体体现。 **一、观察者模式的概念与结构** 1. **概念**:观察者模式也称为发布-订阅(Publish/...
观察者模式是软件设计模式中的一种行为模式,它在对象之间定义了一种一对多的依赖关系,当一个对象的状态发生改变时,所有...在实际开发中,如UI组件监听模型数据变化、事件驱动编程等,观察者模式都扮演着重要的角色。
除了标准实现,还有很多其他语言和框架提供了观察者模式的支持,例如在C#中,可以使用System.ComponentModel.INotifyPropertyChanged接口来实现,而在JavaScript中,可以通过事件监听器或者发布/订阅模式来实现类似...
观察者模式也被称为发布-订阅(Publish/Subscribe)模式或者事件驱动模型,广泛应用于事件处理和消息传递。 这组学习资料可能包含以下内容: 1. **策略模式**的学习文档,可能会通过具体的案例,如不同排序算法的...
在Android中,`java.util.Observable`和`java.util.Observer`类就实现了观察者模式的基础结构。但通常在Android开发中,我们更倾向于使用Android提供的`Observer`和`LiveData`等组件,这些组件更加适应Android的生命...
Java中的事件机制是Java编程中一个重要的概念,它基于观察者模式(Observer Pattern)来实现对象之间的通信。观察者模式是一种行为设计模式,允许你定义一个订阅机制,可以在对象状态改变时通知多个“观察”该对象的...
在Java中,事件驱动编程和发布/订阅模型都广泛使用此模式。 12. 状态模式:状态模式允许对象在其内部状态改变时改变其行为。在处理对象状态变化导致行为变化的问题时,状态模式可以简化代码并提高可读性。 13. ...
在Android开发中,观察者模式(Observer Pattern)是一种常见的设计模式,它允许对象间的一对多依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并自动更新。EventBus是一款轻量级的事件总线...
5. **EventBus**:另一种在Android中实现观察者模式的方式是使用第三方库EventBus,它可以替代基于BroadcastReceiver的事件传递,简化事件发布和订阅的过程。 6. **回调函数**:在Android开发中,我们也经常使用回...
观察者模式在软件体系结构中扮演着重要的角色,特别是在需要动态订阅和通知场景下,例如UI组件更新、事件驱动编程和MVC架构。 在观察者模式中,通常包含以下几个主要的参与者: 1. Subject(主题):定义观察者...
Android框架本身就内置了观察者模式的实现,如`Observer`类和`Observable`接口,它们位于`java.util`包下,允许开发者订阅和监听事件变化。 以下是对观察者模式核心概念的详细说明: 1. **主题(Subject)**:这是...
最后,Flex和ActionScript3是Adobe的富互联网应用程序(RIA)开发平台,它们的事件模型支持发布/订阅模式。ActionScript3中的Event类是所有事件的基础,事件可以被dispatched(发布)并通过addEventListener方法添加...
`RxJava`通过`Observables`(观察者)和`Observers`(观察者)的概念,实现了发布-订阅模式,使得代码更易理解和测试。 在`RxAndroid`和`MVP`结合的项目中,通常有以下步骤: 1. **创建View接口**:定义`View`需要...
Observer模式是一种行为设计模式,...在实际应用中,Observer模式广泛应用于各种场景,如UI组件监听模型数据的变化、订阅/发布系统、消息队列等。理解并熟练运用Observer模式,对于编写可维护、可扩展的代码至关重要。
例如,可能会用到工厂模式来创建Socket对象,单例模式来管理服务器实例,观察者模式来实现消息发布和订阅等。 7. **用户界面(UI)编程** 虽然描述中并未明确提到UI部分,但一个完整的QQ程序必然会有用户界面,这...
1. **观察者模式**:观察者模式是一种行为设计模式,允许你定义一个订阅机制,可以在对象状态改变时通知多个“观察者”。在这个实验中,`_13211415_---_7_ObserverForMainUI`实现了观察者接口,当主界面(`MainUI`)...