/**
*@author ET
*/
我的女儿林格最近越来越可爱了,但是也越来越淘气了,醒了就需要吃饭,总是离不开人,我总是要看着她,妈妈也要形影不离,生怕有意外发生。
如果上面的描述如何用程序实现呢?
把我设计成一个线程,不停的监视着宝宝的状态,妈妈设计成另外一个线程,也不停的监视着宝宝的状态,当宝宝醒来的时候在调用喂饭的方法么?
答案肯定是no,那样我一天什么都不能去做,妈妈也是同样,连洗尿布的时间都没有,因为两个人都忙着监护宝宝的状态呢。对,线程就是这样工作的。
那有没有一种其他的方法改善如此场面呢?那就是观察者模式。
首先介绍两个类。
//被观察者
import java.util.Observable;
//观察者
import java.util.Observer;
这是SUN提供给我们的,已经封装好的一个类,和一个接口,当然我们也可以自己实现功能。
下面看看JDK的具体实现。
package java.util;
public class Observable {
private boolean changed = false;
private Vector obs;
//构造函数
public Observable() {
obs = new Vector();
}
/**
* 添加一个观察者
*/
public synchronized void addObserver(Observer o) {
if (o == null)
throw new NullPointerException();
if (!obs.contains(o)) {
obs.addElement(o);
}
}
/**
* 删除一个观察者
*/
public synchronized void deleteObserver(Observer o) {
obs.removeElement(o);
}
/**
* public void notifyObservers(Object arg) 方法的重载
*/
public void notifyObservers() {
notifyObservers(null);
}
/**
* 被观察者发出一个事件,应该调用此方法。比如女儿醒了
*/
public void notifyObservers(Object arg) {
Object[] arrLocal;
synchronized (this) {
if (!changed)
return;
arrLocal = obs.toArray();
clearChanged();
}
for (int i = arrLocal.length-1; i>=0; i--)
((Observer)arrLocal[i]).update(this, arg);
}
/**
* 删除所有观察者
*/
public synchronized void deleteObservers() {
obs.removeAllElements();
}
/**
* 设置改变状态
*/
protected synchronized void setChanged() {
changed = true;
}
/**
* 清除改变状态
*/
protected synchronized void clearChanged() {
changed = false;
}
/**
* 获取改变状态
*/
public synchronized boolean hasChanged() {
return changed;
}
/**
* 观察者数量
*/
public synchronized int countObservers() {
return obs.size();
}
}
以上可以理解为一个被观察者的父类。
package java.util;
public interface Observer {
void update(Observable o, Object arg);
}
观察者是一个接口。
这次让我们来看具体的实现:
女儿的类,继承被观察者类
import java.util.Observable;
public class MyDaughter extends Observable {
public void wake(){
System.out.println("我睡醒啦");
this.setChanged();
this.notifyObservers(this);
//this.clearChanged();
}
}
作为父母的观察者
public class Mother implements Observer {
public void update(Observable arg0, Object arg1) {
System.out.println("妈妈给准备饭吃!");
}
}
public class Father implements Observer {
public void update(Observable o, Object arg) {
System.out.println("爸爸抱抱!");
}
}
测试类
public class Test {
public static void main(String[] args) {
//创建被观察者对象
MyDaughter mDaughter = new MyDaughter();
// 创建观察者对象
Mother mother = new Mother();
Father father = new Father();
// 添加观察者
mDaughter.addObserver(mother);
mDaughter.addObserver(father);
// 宝宝醒来
mDaughter.wake();
}
}
运行后 在控制台输出:
输出
我睡醒啦
爸爸抱抱!
妈妈给准备饭吃!
这样我们就简单的实现了一个观察者模式,当然你不用jdk提供的接口也可以,自己去实现就是了。
分享到:
相关推荐
观察者模式(Observer)是软件设计模式中的一种行为模式,它定义了对象之间的一对多依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并被自动更新。这种模式在C++中广泛应用,特别是在需要...
观察者模式(Observer)是软件设计模式中的一种行为模式,其主要目的是在对象之间建立一种松散耦合的关系,使得当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并自动更新。这种模式广泛应用于事件驱动...
观察者模式,也被称为发布-订阅模式或事件驱动模式,是软件设计模式中的一种行为模式。这个模式的主要目的是在对象之间建立一种松散耦合的关系,使得当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并...
**C#面向对象设计模式纵横谈(19)**:**观察者模式**(Observer Pattern)是行为型模式的一种,它在软件工程中扮演着至关重要的角色。观察者模式是一种设计模式,它定义了对象之间的一对多依赖关系,当一个对象的状态...
在Observer模式中,主要有两个关键角色:Subject(主题)和Observer(观察者)。Subject维护了一个Observer的列表,并负责在状态变化时通知它们。Observer则关注Subject,当Subject状态变化时,Observer会收到通知并...
观察者模式(Observer Pattern)是软件设计模式中的一种行为模式,它定义了对象之间的一对多依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并自动更新。这种模式常用于实现发布-订阅...
观察者模式(Observer Pattern)是设计模式中的一种行为模式,它定义了对象之间的一对多依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并自动更新。这种模式在软件开发中广泛应用于事件驱动...
观察者模式 概述 定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。 适用性 1.当一个抽象模型有两个方面,其中一个方面依赖于另一方面。 将这二者封装...
Observer (观察者模式) 又叫做发布/订阅(Publish/Subscribe)模式。 当一个对象的改变同时会影响其他对象的行为的时候,可以使用此设计模式。 l 主题对象 :一个需要被关注的主题对象,这个主题对象改变会影响...
标题中的"OBserver模式设计实现"是指探讨如何在实际编程中应用观察者模式,无论是用Java还是C++。Head First系列书籍是著名的编程学习资源,以易懂的方式解释复杂的设计模式。在描述中提到的"Head First模式设计用的...
本篇文章将深入探讨“Observer”观察者模式,这是一种行为设计模式,它定义了对象之间的一对多依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并自动更新。 观察者模式的核心概念是主题...
结合微信公众号讲解观察者模式,生动形象,关键是上手快啊
观察者模式通常的叫法叫做订阅-发布模式,类似于报刊杂志的订阅,观察者和被观察者就是读者和邮局的关系,读者先要在邮局订阅想要的报刊,当报刊发行时,邮局会将报刊邮寄到读者家里。观察者(Observer)和被观察者...
观察者模式(Observer Pattern)是软件设计模式中的行为模式之一,它定义了对象之间的一对多依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并自动更新。这种模式常用于实现事件驱动或发布-...
观察者模式(Observer Pattern)是一种行为设计模式,它允许你定义一个订阅机制,可以在对象状态改变时通知多个“观察”该对象的其他对象。在软件工程中,这常用于实现事件驱动编程,使得系统能够及时响应变化。 在...
观察者模式(Observer)是设计模式中的一种行为模式,它定义了对象之间的一对多依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并被自动更新。这种模式在软件开发中广泛应用于事件处理和实时...
观察者模式(Observer Pattern)是软件设计模式中的一种行为模式,它定义了对象之间的一对多依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并自动更新。这种模式常用于实现事件驱动或者发布...
观察者模式(Observer Pattern)是软件设计模式中的一种行为模式,它定义了对象之间的一对多依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并自动更新。这种模式常用于实现事件驱动编程或者...
观察者模式(Observer Pattern)是行为设计模式的一种,它定义了对象之间的一对多依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并自动更新。 观察者模式的核心思想是发布-订阅模型,其中...
观察者模式(Observer Pattern)是软件设计模式中的一种行为模式,它定义了对象之间的一对多依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并自动更新。这种模式常用于事件驱动的系统或者...