java模式之观察者模式
来源:互联网 发布:酒店软件管理系统 编辑:程序博客网 时间:2024/04/28 13:16
所谓观察者模式指的是一对多的关系的模式,可以用消息发布来作为比喻,发布者对应多个接受者,接受者可以注册或者删除订阅
最典型的观察者模式应用的是Java的Swing时间监听事件,每个listener注册到事件处理的Handler中,当事件源发生的时候,将遍历(广播)消息到所有的Listener中执行相应的方法,如actionPerform()中;
下面简单介绍一下我所理解的观察者模式。
首先是订阅者,Listener接口:
package com.luchi.model.observer;public interface Listener {public void attachToObserver(Observer observer);public void doThings();}
接口主要有两个方法,一个是attachToObserver,也就是订阅;一个是doThings()也就是其主要的工作
在定义Observer接口:
package com.luchi.model.observer;public interface Observer {public void addListner(Listener listener);public void removeListner(Listener listener);public void broadcastMsgs();}其中 addListener()和removeListener()均是来增加或者减少订阅者的消息。broadcast()方法则是通知消息
接下来我们看下Listener的两个实现
package com.luchi.model.observer;public class ListenerImpl1 implements Listener{@Overridepublic void doThings() {// TODO Auto-generated method stubSystem.out.println("ths is "+this.getClass().getName());}@Overridepublic void attachToObserver(Observer observer) {// TODO Auto-generated method stubobserver.addListner(this);}}package com.luchi.model.observer;public class ListenerImpl2 implements Listener{@Overridepublic void doThings() {// TODO Auto-generated method stubSystem.out.println("ths is "+this.getClass().getName());}@Overridepublic void attachToObserver(Observer observer) {// TODO Auto-generated method stubobserver.addListner(this);}}以及Observer实现
package com.luchi.model.observer;import java.util.HashSet;import java.util.Set;public class ObserverImpl implements Observer{private Set<Listener> listeners=new HashSet<Listener>();@Overridepublic void addListner(Listener listener) {// TODO Auto-generated method stubsynchronized (listeners) {listeners.add(listener);}}@Overridepublic void removeListner(Listener listener) {// TODO Auto-generated method stubsynchronized (listeners) {listeners.remove(listener);}}@Overridepublic void broadcastMsgs() {// TODO Auto-generated method stubsynchronized (listeners) {for(Listener node:listeners){node.doThings();}}}}然后看一下测试程序:
package com.luchi.model.observer;public class TestObserver {public static void main(String[]args){ObserverImpl observer =new ObserverImpl();ListenerImpl1 listener1=new ListenerImpl1();ListenerImpl2 listener2=new ListenerImpl2();listener1.attachToObserver(observer);listener2.attachToObserver(observer);observer.broadcastMsgs();}}一个Observer有两个订阅者,然后看下结果
ths is com.luchi.model.observer.ListenerImpl2ths is com.luchi.model.observer.ListenerImpl1
由于HashSet有排序,姑且不用去看输出顺序。
这是比较简单的实现方式,当然复杂的话,可以为每个Observer设置一个Handler,在Handler实现add和remove方法就行。另外考虑到时间的复杂性,也可以设计一个事件的接口,EventSource之类的,并实现即可。
这这是最简单的观察者模式,我称之为订阅模式,类比于Java的Swing的监听事件,如给一个Button绑定listener,在Listener中实现相应的动作,当事件发生的时候(在Button中表示按下按钮事件),Button会将该动作传递到每一个订阅的Listener中并执行Listener中相应的动作,当然Swing实现的比较复杂,涉及到多线程的同步和通信过程,在此不提及
0 0
- java模式之观察者模式
- java模式之观察者模式
- Java之观察者模式
- Java之观察者模式
- Java之观察者模式
- java之观察者模式
- java之观察者模式
- java之观察者模式
- Java设计模式之观察者
- Java设计模式之观察者
- Java设计模式之Observer(观察者)模式
- Java设计模式之Observer 观察者模式
- Java设计模式之Observer-观察者模式
- Java模式之观察者模式(Observer)
- java 设计模式之二-观察者模式
- Java设计模式之观察者模式
- java设计模式之观察者模式
- java设计模式之观察者模式Observer
- Java模式之单例模式
- Linux-CentOS7学习3_目录结构
- java模式之装饰者模式
- java并发编程学习笔记1
- java并发编程学习笔记2
- java模式之观察者模式
- java并发编程学习笔记之线程池等源码小析
- 笔试题小解
- 从notify-wait模式说去
- java 并发编程之同步器
- 模拟浏览器访问增加页面浏览数量
- Integer与int的种种比较你知道多少?——转自博客园
- ForkAndJoin实践
- 简单的Java读取xml文件