`
colcool
  • 浏览: 66419 次
  • 性别: Icon_minigender_1
  • 来自: 鞍山
社区版块
存档分类
最新评论

设计模式 观察者模式 Observer

 
阅读更多

 

/**
 *@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提供的接口也可以,自己去实现就是了。

5
5
分享到:
评论
2 楼 kissmydream 2011-07-25  
Thanks a lot,I get it.
1 楼 yixibo 2011-07-25  
这是我目前看到最易懂的设计模式描述,多谢!

相关推荐

    设计模式C++学习之观察者模式(Observer)

    观察者模式(Observer)是软件设计模式中的一种行为模式,它定义了对象之间的一对多依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并被自动更新。这种模式在C++中广泛应用,特别是在需要...

    设计模式之观察者模式(Observer)

    观察者模式(Observer)是软件设计模式中的一种行为模式,其主要目的是在对象之间建立一种松散耦合的关系,使得当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并自动更新。这种模式广泛应用于事件驱动...

    设计模式之观察者模式(Observer Pattern)

    观察者模式,也被称为发布-订阅模式或事件驱动模式,是软件设计模式中的一种行为模式。这个模式的主要目的是在对象之间建立一种松散耦合的关系,使得当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并...

    C#面向对象设计模式纵横谈(19):(行为型模式) Observer 观察者模式 (Level 300)

    **C#面向对象设计模式纵横谈(19)**:**观察者模式**(Observer Pattern)是行为型模式的一种,它在软件工程中扮演着至关重要的角色。观察者模式是一种设计模式,它定义了对象之间的一对多依赖关系,当一个对象的状态...

    Observer设计模式实例

    在Observer模式中,主要有两个关键角色:Subject(主题)和Observer(观察者)。Subject维护了一个Observer的列表,并负责在状态变化时通知它们。Observer则关注Subject,当Subject状态变化时,Observer会收到通知并...

    设计模式实现——观察者模式

    观察者模式(Observer Pattern)是软件设计模式中的一种行为模式,它定义了对象之间的一对多依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并自动更新。这种模式常用于实现发布-订阅...

    [行为模式]head first 设计模式之观察者模式(observer)

    观察者模式(Observer Pattern)是设计模式中的一种行为模式,它定义了对象之间的一对多依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并自动更新。这种模式在软件开发中广泛应用于事件驱动...

    Observer 观察者模式 示例 源码 ----设计模式

    观察者模式 概述 定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。 适用性 1.当一个抽象模型有两个方面,其中一个方面依赖于另一方面。 将这二者封装...

    设计模式 观察者 发布/订阅 Observer

    Observer (观察者模式) 又叫做发布/订阅(Publish/Subscribe)模式。 当一个对象的改变同时会影响其他对象的行为的时候,可以使用此设计模式。 l 主题对象 :一个需要被关注的主题对象,这个主题对象改变会影响...

    设计模式之略见一斑(Observer观察者模式)

    本篇文章将深入探讨“Observer”观察者模式,这是一种行为设计模式,它定义了对象之间的一对多依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并自动更新。 观察者模式的核心概念是主题...

    Java 设计模式-观察者模式(Observer)

    结合微信公众号讲解观察者模式,生动形象,关键是上手快啊

    C++设计模式之观察者模式(Observer)

    观察者模式通常的叫法叫做订阅-发布模式,类似于报刊杂志的订阅,观察者和被观察者就是读者和邮局的关系,读者先要在邮局订阅想要的报刊,当报刊发行时,邮局会将报刊邮寄到读者家里。观察者(Observer)和被观察者...

    设计模式-观察者模式-作业-observer.zip

    观察者模式(Observer Pattern)是软件设计模式中的行为模式之一,它定义了对象之间的一对多依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并自动更新。这种模式常用于实现事件驱动或发布-...

    observer观察者模式

    观察者模式(Observer Pattern)是一种行为设计模式,它允许你定义一个订阅机制,可以在对象状态改变时通知多个“观察”该对象的其他对象。在软件工程中,这常用于实现事件驱动编程,使得系统能够及时响应变化。 在...

    观察者模式Observer

    观察者模式(Observer)是设计模式中的一种行为模式,它定义了对象之间的一对多依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并被自动更新。这种模式在软件开发中广泛应用于事件处理和实时...

    java 设计模式 观察者模式 简单实例 包括测试test类

    观察者模式(Observer Pattern)是软件设计模式中的一种行为模式,它定义了对象之间的一对多依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并自动更新。这种模式常用于实现事件驱动或者发布...

    设计模式之Observer - 观察者模式

    观察者模式(Observer Pattern)是软件设计模式中的一种行为模式,它定义了对象之间的一对多依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并自动更新。这种模式常用于实现事件驱动编程或者...

    设计模式-观察者

    观察者模式(Observer Pattern)是行为设计模式的一种,它定义了对象之间的一对多依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并自动更新。 观察者模式的核心思想是发布-订阅模型,其中...

    设计模式之观察者模式Java实现

    观察者模式(Observer Pattern)是软件设计模式中的一种行为模式,它定义了对象之间的一对多依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并自动更新。这种模式常用于事件驱动的系统或者...

    设计模式之观察者模式

    观察者模式是软件设计模式中的一种行为模式,它在对象之间定义了一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并自动更新。这种模式广泛应用于事件驱动编程、发布/订阅系统...

Global site tag (gtag.js) - Google Analytics