java观察者模式(转)
简单地说,观察者模式定义了一个一对多的依赖关系,让一个或多个观察者对象监察一个主题对象。这样一个主题对象在状态上的变化能够通知所有的依赖于此对象的那些观察者对象,使这些观察者对象能够自动更新。
不多说了,直接给出实现:
例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观察者模式(转)的更多相关文章
- 用Spring提高java观察者模式灵活性
在上篇博客 用java观察者模式解耦经典三层架构 的最后,用了一个Client类把Listener的实现类注冊到了LoginEventSource类中,假设须要加入�新的逻辑,加入�新的listene ...
- java: 观察者模式:Observable被观察者,Observer观察者
java: 观察者模式:Observable被观察者,Observer观察者 以房子价格为例,卖房者为被观察者: import java.util.Observable; //被观察者子类化 publ ...
- java观察者模式
像activeMQ等消息队列中,我们经常会使用发布订阅模式,但是你有没有想过,客户端时如何及时得到订阅的主题的信息?其实就里就用到了观察者模式.在软件系统中,当一个对象的行为依赖于另一个对象的状态 ...
- Java——观察者模式实例
观察者模式(订阅/发布模式) 作者: 代码大湿 代码大湿 Java中观察者模式中主要是Observerable类(被观察者),和Observer接口(观察者).下面是个简单的demo //被观察者 p ...
- java 观察者模式 与spring配置
一.Observer模式的意图: 在对象的内部状态发生变化时,自动通知外部对象进行响应. 二.Observer模式的构成: ·被观察者:内部状态有可能被改变,而且又需要通知外部的对象 ·观察者:需要对 ...
- Java观察者模式(Observer)
一.定义 观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象.这个主题对象在状态上发生变化时,会通知所有观察者对象,让他们能够自动更新自己.主要应用在java的AWT事件机制 ...
- 说说Java观察者模式
观察者模式是对象行为模式中的一种,在平时项目中经常被用来解耦对象之间的依赖. 观察者模式定义了对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖它的对象都得到通知并自动更新.别名:De ...
- java 观察者模式
/** 抽象的观察者 */ public interface Watcher { // status 为 被被观察着传递过来的状态 public void update(String status); ...
- Java观察者模式(Observer模式)
Java深入到一定程度,就不可避免的碰到设计模式(design pattern)这一概念,了解设计模式,将使自己对java中的接口或抽象类应用有更深的理解.设计模式在java的中型系统中应用广泛,遵循 ...
- java观察者模式的实现
在看博客里,有个订阅功能,当你订阅后,当博主发布新的博客,你都能收到消息.这是如何实现的?是不是后台有个线程在不停的轮询?如果是这样的话,显然太耗资源,如果当博客在发布时,找到所有的订阅者,然后循环的 ...
随机推荐
- Linux 下 Error: Could not find or load main class Hello
在linux下写了一个很easy的Hello world程序,编译执行居然报错:Error: Could not find or load main class Hello 最后发现是CLASSPAT ...
- 2048 Puzzle游戏攻略
2048 Puzzle这是目前手机游戏的很火. 在地铁上经常看到的人玩这个游戏. 首先,简介2048 Puzzle游戏. 游戏界面是4X4广场格,每一方格可以放置在数字. 有四种移动数字的方法,向左. ...
- 认识node.js:express(一)
express是node.js官方推荐的框架. 安装 npm install express -g 命令中的 “-g” 表示全局(global) 由于新版本(4.x.x)的express的命令集中到了 ...
- Winform WebBrowser引用IE版本问题
做了一个Winform的项目.项目里使用了WebBrowser控件.以前一直都以为WebBrowser是直接调用的系统自带的IE,IE是呈现出什么样的页面WebBrowser就呈现出什么样的页面.其实 ...
- Linux X86在下面TLB机制
TLB - translation lookaside buffer 快表.直译为翻译后备缓冲器,也能够理解为页表缓冲.地址变换快速缓存. 因为页表存放在主存中,因此程序每次訪存至少须要两次:一次訪存 ...
- C# 读取IE缓存文件(2)
private void button1_Click(object sender, EventArgs e) { , nBufSize; IntPtr buf; INTERNET_CACHE_ENTR ...
- 更改IOS于UISearchBar撤消button底、搜索输入文本框背景中的内容和UISearchBar底
转载请标明出处:http://blog.csdn.net/android_ls/article/details/39993433 測试的手机IOS系统版本为:6.1.3,实现过程例如以下: 1.加入U ...
- SQL Server 连接问题-命名管道
原文:SQL Server 连接问题-命名管道 出自:http://blogs.msdn.com/b/apgcdsd/archive/2011/01/12/sql-server-1.aspx 一.前言 ...
- curl转让query string逃生参数
假设curl访问http网站.传递参数.需要使用\如&字首. 例: http://myjenkins/job/run_schedule/buildWithParameters?token=fe ...
- 使用RESTClient插件数据模拟(GET,POST)提交
1:在Firefox下载RESTClient插件安装 2:安装界面后, 3:点击设置头文件:(设请求地址有头部文件) 4:设置界面,当然有非常多选择.依据你的须要.一般在输入的时候有智能提示,我这里以 ...