`
543089122
  • 浏览: 153158 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
社区版块
存档分类
最新评论

简单_从java ui事件模型看发布订阅模式和观察者模式的区别

 
阅读更多
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();
	}
}
0
0
分享到:
评论

相关推荐

    一个类实现Android观察者模式(最简单实用的观察者模式)

    观察者模式是软件设计模式中的一种行为模式,它在Android开发中被广泛应用,尤其是在处理事件响应和组件间的通信。这个模式允许对象订阅另一个对象的状态变化,当被观察的对象发生改变时,所有订阅者都会被通知并...

    java设计模式之观察者模式

    这一模式在Java中得到了很好的实现,Java的`java.util.Observable`类和`java.util.Observer`接口就是观察者模式的具体体现。 **一、观察者模式的概念与结构** 1. **概念**:观察者模式也称为发布-订阅(Publish/...

    观察者模式1Demo

    观察者模式是软件设计模式中的一种行为模式,它在对象之间定义了一种一对多的依赖关系,当一个对象的状态发生改变时,所有...在实际开发中,如UI组件监听模型数据变化、事件驱动编程等,观察者模式都扮演着重要的角色。

    观察者模式学习

    除了标准实现,还有很多其他语言和框架提供了观察者模式的支持,例如在C#中,可以使用System.ComponentModel.INotifyPropertyChanged接口来实现,而在JavaScript中,可以通过事件监听器或者发布/订阅模式来实现类似...

    策略模式工厂方法模式观察者模式

    观察者模式也被称为发布-订阅(Publish/Subscribe)模式或者事件驱动模型,广泛应用于事件处理和消息传递。 这组学习资料可能包含以下内容: 1. **策略模式**的学习文档,可能会通过具体的案例,如不同排序算法的...

    Android 设计模式:(一)观察者模式 —— 封装行为的大局观

    在Android中,`java.util.Observable`和`java.util.Observer`类就实现了观察者模式的基础结构。但通常在Android开发中,我们更倾向于使用Android提供的`Observer`和`LiveData`等组件,这些组件更加适应Android的生命...

    java中的事件机制

    Java中的事件机制是Java编程中一个重要的概念,它基于观察者模式(Observer Pattern)来实现对象之间的通信。观察者模式是一种行为设计模式,允许你定义一个订阅机制,可以在对象状态改变时通知多个“观察”该对象的...

    Java企业设计模式

    在Java中,事件驱动编程和发布/订阅模型都广泛使用此模式。 12. 状态模式:状态模式允许对象在其内部状态改变时改变其行为。在处理对象状态变化导致行为变化的问题时,状态模式可以简化代码并提高可读性。 13. ...

    android观察者模式:EventBus实现GPS定位

    在Android开发中,观察者模式(Observer Pattern)是一种常见的设计模式,它允许对象间的一对多依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并自动更新。EventBus是一款轻量级的事件总线...

    观察者模式for android demo

    5. **EventBus**:另一种在Android中实现观察者模式的方式是使用第三方库EventBus,它可以替代基于BroadcastReceiver的事件传递,简化事件发布和订阅的过程。 6. **回调函数**:在Android开发中,我们也经常使用回...

    2 观察者模式-MOOC课程内容.pdf

    观察者模式在软件体系结构中扮演着重要的角色,特别是在需要动态订阅和通知场景下,例如UI组件更新、事件驱动编程和MVC架构。 在观察者模式中,通常包含以下几个主要的参与者: 1. Subject(主题):定义观察者...

    观察者模式

    Android框架本身就内置了观察者模式的实现,如`Observer`类和`Observable`接口,它们位于`java.util`包下,允许开发者订阅和监听事件变化。 以下是对观察者模式核心概念的详细说明: 1. **主题(Subject)**:这是...

    事件模型探究及配套源码

    最后,Flex和ActionScript3是Adobe的富互联网应用程序(RIA)开发平台,它们的事件模型支持发布/订阅模式。ActionScript3中的Event类是所有事件的基础,事件可以被dispatched(发布)并通过addEventListener方法添加...

    RxAndroid配合MVP模式,执行网络操作并更新ui的demo

    `RxJava`通过`Observables`(观察者)和`Observers`(观察者)的概念,实现了发布-订阅模式,使得代码更易理解和测试。 在`RxAndroid`和`MVP`结合的项目中,通常有以下步骤: 1. **创建View接口**:定义`View`需要...

    Observer 模式

    Observer模式是一种行为设计模式,...在实际应用中,Observer模式广泛应用于各种场景,如UI组件监听模型数据的变化、订阅/发布系统、消息队列等。理解并熟练运用Observer模式,对于编写可维护、可扩展的代码至关重要。

    java qq程序源码

    例如,可能会用到工厂模式来创建Socket对象,单例模式来管理服务器实例,观察者模式来实现消息发布和订阅等。 7. **用户界面(UI)编程** 虽然描述中并未明确提到UI部分,但一个完整的QQ程序必然会有用户界面,这...

    实验报告2

    1. **观察者模式**:观察者模式是一种行为设计模式,允许你定义一个订阅机制,可以在对象状态改变时通知多个“观察者”。在这个实验中,`_13211415_---_7_ObserverForMainUI`实现了观察者接口,当主界面(`MainUI`)...

Global site tag (gtag.js) - Google Analytics