所谓观察者模式指的是一对多的关系的模式,可以用消息发布来作为比喻,发布者对应多个接受者,接受者可以注册或者删除订阅
最典型的观察者模式应用的是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{ @Override public void doThings() { // TODO Auto-generated method stub System.out.println("ths is "+this.getClass().getName()); } @Override public void attachToObserver(Observer observer) { // TODO Auto-generated method stub observer.addListner(this); } } package com.luchi.model.observer; public class ListenerImpl2 implements Listener{ @Override public void doThings() { // TODO Auto-generated method stub System.out.println("ths is "+this.getClass().getName()); } @Override public void attachToObserver(Observer observer) { // TODO Auto-generated method stub observer.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>(); @Override public void addListner(Listener listener) { // TODO Auto-generated method stub synchronized (listeners) { listeners.add(listener); } } @Override public void removeListner(Listener listener) { // TODO Auto-generated method stub synchronized (listeners) { listeners.remove(listener); } } @Override public void broadcastMsgs() { // TODO Auto-generated method stub synchronized (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.ListenerImpl2 ths is com.luchi.model.observer.ListenerImpl1
由于HashSet有排序,姑且不用去看输出顺序。
这是比较简单的实现方式,当然复杂的话,可以为每个Observer设置一个Handler,在Handler实现add和remove方法就行。另外考虑到时间的复杂性,也可以设计一个事件的接口,EventSource之类的,并实现即可。
这这是最简单的观察者模式,我称之为订阅模式,类比于Java的Swing的监听事件,如给一个Button绑定listener,在Listener中实现相应的动作,当事件发生的时候(在Button中表示按下按钮事件),Button会将该动作传递到每一个订阅的Listener中并执行Listener中相应的动作,当然Swing实现的比较复杂,涉及到多线程的同步和通信过程,在此不提及
相关推荐
java观察者模式观察者模式java观察者模式观察者模式java观察者模式观察者模式
java 设计模式 观察者模式 简单实例 包括测试test类
设计模式之观察者模式Java版本实现和UML类设计图
java观察者模式的实例代码。从最简单的实例开始,到观察者模式。有什么问题可以加扣扣共同探讨
Java设计模式的观察者模式讲解,可以由浅入深了解观察者模式的应用。
观察者模式:对象之间多对一依赖的一种设计方案,被依赖的对象为Subject,依赖的对象为Observer,Subject通知Observer变化,这个例子是java内置观察者模式
Java 观察者模式的浅析 简单地说,观察者模式定义了一个一对多的依赖关系,让一个或多个观察者对象监察一个主题对象。这样一个主题对象在状态上的变化能够通知所有的依赖于此对象的那些观察者对象,使这些观察者...
设计模式--观察者模式java例子
结合微信公众号讲解观察者模式,生动形象,关键是上手快啊
运用观察者模式及MVC模式的整合,是javaWeb的简单的实现了选民投票
Java线程池及观察者模式解决多线程意外死亡重启问题,附件含两个要运行代码!
java实现观察者设计模式,利用ApplicationListener和ApplicationEvent。Test包里有测试代码
java 子线程通过观察者模式通知主线程
java内置的观察者模式demo,通过此demo了解如何通过java内置支持创建观察者模式。
设计模式:观察者模式java和javabean
观察者模式java 应用场景如下 现在有一个销售各类的电子商务网站的购物车(Shopping Cart)系统。现在本网站进行打折,分别情况如下: 1. 对所有的教材类图书实行每本降价一元的折扣 2. 对连环画类图书提供7%的...
设计模式----观察者模式demo,使用java自带的工具类,实现,后面会上传一个完全自己代码实现的demo
观察者模式实例,用到java的继承,多态,加深概念理解.
观察者模式(有时又被称为发布(publish )-订阅(Subscribe)模式、模型-视图(View)模式、源-收听者(Listener)模式或从属者模式)是软件设计模式的一种。在此种模式中,一个目标物件管理所有相依于它的观察者物件...
一个很简单但是明了的java观察者模式的demo。备注几乎每行都加了。