设计模式之监听器模式

事件处理模型:

组件(事件源)不处理自己的事件,而是将事件处理委托给外部的处理实体(监听器,

这种事件处理模型称为事件的 授权处理模型。

不同的事件,可以交由不同类型的监听器去处理

事件源:

提供订阅与取消监听者的方法,并负责维护监听者列表,发送事件给监听者

监听者:

每个监听者实现接口来接收事件,并负责从事件源订阅与取消订阅

图示:

demo

事件源:

Context:

package com.demo.event;

import java.util.ArrayList;
import java.util.List;

public class Context {
	private static List<Listener> list=new ArrayList<Listener>();
	public static void addListener(Listener listener){
		list.add(listener);
	}
	public static void removeListener(Listener listener){
		list.remove(listener);
	}
	public static void sendNotification(Event event){
		for(Listener listener:list){
			listener.onChange(event);
		}
	}
}

监听者:

Listener

package com.demo.event;

public interface Listener {
	public void onChange(Event event);
}

MyListener

package com.demo.event;

public class MyListener implements Listener {

	@Override
	public void onChange(Event event) {
		switch(event.getType()){
			case Event.INSTALLED:
				System.out.println("do install...");
				break;
			case Event.STARTED :
				System.out.println("do started...");
				break;
			case Event.RESOLVED :
				System.out.println("do resolved...");
				break;
			case Event.STOPPED :
				System.out.println("do stopped...");
				break;
			case Event.UNRESOLVED :
				System.out.println("do unresolved...");
				break;
			case Event.UNINSTALLED :
				System.out.println("do uninstalled...");
				break;
			default:
				throw new IllegalArgumentException();
		}
	}

}

事件:

package com.demo.event;

public class Event {
	public static final int INSTALLED =1;
	public static final int STARTED =2;
	public static final int RESOLVED  =3;
	public static final int STOPPED =4;
	public static final int UNRESOLVED  =5;
	public static final int UNINSTALLED   =6;
	private int type ;
	private Object source ;
	public Event(int type, Object source) {
		this.type = type;
		this.source = source;
	}
	public int getType() {
		return type;
	}
	public Object getSource() {
		return source;
	}
}

测试:

package com.demo.event;

public class EventTest {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		Listener listener=new MyListener();
		//添加监听者
		Context.addListener(listener);
		//模拟bundle安装完成事件触发
		Context.sendNotification(new Event(Event.INSTALLED, new MyBundle()));
	}

}
时间: 2024-08-01 01:45:49

设计模式之监听器模式的相关文章

java设计模式--观察者模式和事件监听器模式

文章转载于:http://www.java2000.net/p9452 复习设计模式,看到observer观察者模式,说法是该模式和iterator迭代器模式类似已经被整合进jdk,但是jdk提供了两种接口: 一.java.util.Observer -- 观察者接口 对应: java.util.Observable --受查者根类 二.java.util.EventListener -- 事件监听/处理接口 对应: java.util.EventObject -- 事件(状态)对象根类 研究了

Java设计模式补充:回调模式、事件监听器模式、观察者模式(转)

一.回调函数 为什么首先会讲回调函数呢?因为这个是理解监听器.观察者模式的关键. 什么是回调函数 所谓的回调,用于回调的函数. 回调函数只是一个功能片段,由用户按照回调函数调用约定来实现的一个函数. 有这么一句通俗的定义:就是程序员A写了一段程序(程序a),其中预留有回调函数接口,并封装好了该程序.程序员B要让a调用自己的程序b中的一个方法,于是,他通过a中的接口回调自己b中的方法. 举个例子: 这里有两个实体:回调抽象接口.回调者(即程序a) 回调接口(ICallBack ) public i

监听器模式、观察者模式

最近在学习netty的时候,发现里面用到了监听器模式,感觉非常实用,以前看设计模式的时候只是看,并没有用上.其实这是一个非常重要并实用的设计模式,在很多框架里面都用到了. netty里面的应用: serverBootstrap.bind(8000).addListener(new GenericFutureListener<Future<? super Void>>() { public void operationComplete(Future<? super Void&g

设计模式之单列模式

设计模式之单列模式 1,何为单列模式? 即singleton 在某个类采用了单列模式之后  其只能有一个实列对象 ,并且这个实列对象只能有内部自己创建并提供给外部的调用. 2.实现单列模式的方法 分为 :饿汉式 ,懒汉式 下面为饿汉式实现代码: public calss Singleton1{ //将构造函数私有化 防止外部通过new来创建对象 private Singleton1(){ } //创建一个私有静态变量并直接初始化 类加载的时候直接创建对象 private static Singl

设计模式09-组合模式

1. 概念 有时候又叫做部分-整体模式    存在整体和部分的时候  希望客户端忽略整体和部分的区别 2. 案例 /********************************************************************** * <pre> * FILE : Demo01.java * CLASS : Demo01 * * AUTHOR : Liaokailin * * FUNCTION : TODO * * *=========================

设计模式13-代理模式

1. 概念 代理模式又称为委托模式 :为其他对象提供一种代理以控制对这个对象的访问. 2. 案例 package org.demo.proxy.demo01; public class Demo03 { public static void main(String[] args) { IUser user = new UserProxy(new UserImpl()) ; user.action() ; } } interface IUser{ void action() ; } class U

设计模式12-享元模式

1. 概念 享元模式(FlyWeight),运用共享技术有效的支持大量细粒度的对象 2. 案例 /********************************************************************** * <pre> * FILE : Demo01.java * CLASS : Demo01 * * AUTHOR : Liaokailin * * FUNCTION : TODO * * *==================================

每天一个设计模式-7 生成器模式(Builder)

每天一个设计模式-7 生成器模式(Builder) 一.实际问题 在讨论工厂方法模式的时候,提到了一个导出数据的应用框架,但是并没有涉及到导出数据的具体实现,这次通过生成器模式来简单实现导出成文本,Xml等具体的格式. 导出成文本或Xml等格式的数据时,一般都会有各自的格式,比如:导出的文件都有3个部分,文件头,内容,尾. 二.问题分析 无论哪种导出格式,都需要3个部分,文件头,内容,尾等信息,并且他们的内容相同.即他们的构造算法固定,只是生成的结果不同:能不能把算法(构建)和结果(外观)分离出

设计模式-抽象工厂模式(C#)

设计模式--抽象工厂模式(JAVA) 在抽象工厂模式中,一个具体工厂可以生产一组相关的具体产品,这样的一组产品成为产品族,产品族中的每一个产品都属于某一个产品继承等等级结构.当系统所提供的工厂生产的具体产品并不是一个简单的对象,而是多个位于不同产品等级结构.属于不同类型的具体产品时就可以使用抽象工厂模式. 抽象工厂模式与工厂方法模式最大的区别在于,工厂方法模式针对的是一个产品等级结构,而抽象工厂模式需要面对多个产品等级结构,一个工厂等级结构可以负责多个不同产品等级结构中的产品对象的创建,当一个工