简单地说,观察者模式定义了一个一对多的依赖关系,让一个或多个观察者对象监察一个主题对象。这样一个主题对象在状态上的变化能够通知所有的依赖于此对象的那些观察者对象,使这些观察者对象能够自动更新。

不多说了,直接给出实现:

例1:

/**
* 对某个事件只有一个订阅者的例子
* @author yongxing.shao
*
*/
public class OneObserverExample {
public static void main(String[] args) {
IObserver observer = new Observer();
EventNotifier notifier = new EventNotifier(observer);
notifier.doWork();
}
} //对某事件感兴趣的观察者接口
interface IObserver {
public void processInterestedEvent();
} /**
* 当一事件发生时,需要通知实现IObserver接口的对象,并调用interesingEvent()方法
* @author yongxing.shao
*
*/
class EventNotifier {
private IObserver observer; //观察者
private boolean somethingHappened; //标志事件是否发生 public EventNotifier(IObserver observer) {
this.observer = observer;
this.somethingHappened = false;
} public void doWork() {
somethingHappened = true;
if (somethingHappened) {
//事件发生时,通过调用接口的这个方法来通知
observer.processInterestedEvent();
}
}
} /**
* 观察者实现
* @author yongxing.shao
*
*/
class Observer implements IObserver {
private EventNotifier en; public Observer() {
//新建一个事件通知者对象,并把自己传递给它
this.en = new EventNotifier(this);
} //实现事件发生时,实际处理事件的方法
public void processInterestedEvent() {
System.out.println("Observer: event happened");
}
}
 

例2:

/**
* 对某个事件存在多个订阅者
* @author yongxing.shao
*
*/
public class ManyObserverExample {
public static void main(String[] args) {
EventNotifier notifier = new EventNotifier(); IObserver observerA = new Observer("Observer A");
IObserver observerB = new Observer("Observer B"); //regist
notifier.regist(observerA);
notifier.regist(observerB); notifier.doWork();
}
} /**
* 对某事件感兴趣的观察者接口
* @author yongxing.shao
*
*/
interface IObserver {
public void processInterestedEvent(String event);
} class Observer implements IObserver {
private String name; public Observer(String name) {
this.name = name;
} //实现事件发生时,实际处理事件的方法
public void processInterestedEvent(String event) {
System.out.println(name + ": [" + event + "] happened.");
}
} /**
* 当一事件发生时,需要通知实现IObserver接口的对象,并调用interesingEvent()方法
* @author yongxing.shao
*
*/
class EventNotifier {
private List<IObserver> observers = new ArrayList<IObserver>(); //观察者 public void regist(IObserver observer) {
observers.add(observer);
} public void doWork() {
for (IObserver observer : observers) {
observer.processInterestedEvent("sample event");
}
}
}

http://blog.csdn.net/xyls12345/article/details/26386885

java观察者模式(转)的更多相关文章

  1. 用Spring提高java观察者模式灵活性

    在上篇博客 用java观察者模式解耦经典三层架构 的最后,用了一个Client类把Listener的实现类注冊到了LoginEventSource类中,假设须要加入�新的逻辑,加入�新的listene ...

  2. java: 观察者模式:Observable被观察者,Observer观察者

    java: 观察者模式:Observable被观察者,Observer观察者 以房子价格为例,卖房者为被观察者: import java.util.Observable; //被观察者子类化 publ ...

  3. java观察者模式

      像activeMQ等消息队列中,我们经常会使用发布订阅模式,但是你有没有想过,客户端时如何及时得到订阅的主题的信息?其实就里就用到了观察者模式.在软件系统中,当一个对象的行为依赖于另一个对象的状态 ...

  4. Java——观察者模式实例

    观察者模式(订阅/发布模式) 作者: 代码大湿 代码大湿 Java中观察者模式中主要是Observerable类(被观察者),和Observer接口(观察者).下面是个简单的demo //被观察者 p ...

  5. java 观察者模式 与spring配置

    一.Observer模式的意图: 在对象的内部状态发生变化时,自动通知外部对象进行响应. 二.Observer模式的构成: ·被观察者:内部状态有可能被改变,而且又需要通知外部的对象 ·观察者:需要对 ...

  6. Java观察者模式(Observer)

    一.定义 观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象.这个主题对象在状态上发生变化时,会通知所有观察者对象,让他们能够自动更新自己.主要应用在java的AWT事件机制 ...

  7. 说说Java观察者模式

    观察者模式是对象行为模式中的一种,在平时项目中经常被用来解耦对象之间的依赖. 观察者模式定义了对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖它的对象都得到通知并自动更新.别名:De ...

  8. java 观察者模式

    /** 抽象的观察者 */ public interface Watcher { // status 为 被被观察着传递过来的状态 public void update(String status); ...

  9. Java观察者模式(Observer模式)

    Java深入到一定程度,就不可避免的碰到设计模式(design pattern)这一概念,了解设计模式,将使自己对java中的接口或抽象类应用有更深的理解.设计模式在java的中型系统中应用广泛,遵循 ...

  10. java观察者模式的实现

    在看博客里,有个订阅功能,当你订阅后,当博主发布新的博客,你都能收到消息.这是如何实现的?是不是后台有个线程在不停的轮询?如果是这样的话,显然太耗资源,如果当博客在发布时,找到所有的订阅者,然后循环的 ...

随机推荐

  1. java线程池的注意事项

    java线程池是建立一个技术进步的线程.到来之前线程池打造一批在线程的线程尚未,队列上的备用,然后再利用这些资源.减少频繁创建和销毁对象, 1.jdk1.5以上提供了现成的线程池 2.java线程池的 ...

  2. 【POJ1741】Tree 树分而治之 模板略?

    做广告: #include <stdio.h> int main() { puts("转载请注明出处[vmurder]谢谢"); puts("网址:blog. ...

  3. Javascript中的__proto__、prototype、constructor

    今天重温了下Javacript,给大家带来一篇Javascript博文,相信对于Javacript有一定了解的人都听过prototype原型这个概念,今天我们深度的分析下prototype与__pro ...

  4. JSP简单的练习-用户登记表

    <%@ page language="java" import="java.util.*" pageEncoding="gb2312" ...

  5. 採訪The Molasses Flood:BioShock Infinite 游戏之后又一大作

    Xsolla有幸与Flame in the Flood游戏的开发人员之中的一个-----Forrest Dowling进行了採訪,Flame in the Flood这款非常棒的游戏在Kickstar ...

  6. 微软中国裁员曝光:在CD结束后!薪酬不变!

    聚众抗议的前诺基亚员工(腾讯科技配图) 腾讯科技 郭晓峰 腾讯科技刚刚获取了一份微软设备事业部中国区管理团队4日晚间发给被裁员工的补偿方案邮件. 邮件内容显示,微软承诺在收购诺基亚交易结束(2014年 ...

  7. Android lint具 常见问题检查

    1. Correctness 1) DuplicatedIds Layout于id应该唯一 2) NewApi 代码中使用的某些API高于Manifest中的Min SDK 3) Inconsiste ...

  8. PHP之运用CI用钩子实现URL权限控制————————【Badboy】

    <span style="background-color: rgb(247, 252, 255); font-family: Verdana, Arial, Helvetica, s ...

  9. 部署Redis主-从

    Redis主-从部署实践 0. 前言 这篇文章简要介绍Redis的主从部署,实现了一主二从,使用两个哨兵监控,以实现简单的HA,其中从库作为备机. 1. 部署 这里有三台服务器,其中239主机上的Re ...

  10. 50一个Android开发技巧(01 利用好layout_weight属性)

    问题:如何将一个Button放置在布局的中间,并设置其宽度parent的50%? 分析:问题想要达到的效果应该是这样: (原文地址:http://blog.csdn.net/vector_yi/art ...