`
suky
  • 浏览: 146951 次
  • 性别: Icon_minigender_2
  • 来自: 厦门
社区版块
存档分类
最新评论

观察者模式

 
阅读更多

    java.util包内包含最基本的Observer接口与Observable类。


    

package java.util;

public interface Observer {
    
    void update(Observable o, Object arg);//
}

 

    被观察对象改变时,调用update方法更新。


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) {

        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);
    }
    protected synchronized void setChanged() {
	   changed = true;
    }

......
}

 

      从源代码中,可以看出使用一种“注册——通知——撤销注册”的形式。首先将观察者(Observer)注册到被观察对象(Observable)中,被观察对象会将观察者存放在一个容器(Vector obs)里。当被观察对象发生了某种变化(setChanged())时,notifyObservers方法从容器中得到所有注册过的观察者,将变化通知观察者。
若观察者告诉被观察者要撤销观察,只需要被观察者从容器中将观察者去除即可。

      使用时,我们需要写一个类去继承Observable,并告诉它何时该通知观察者。示例代码如下:


package ObserverTest;

import java.util.Observable;
import java.util.Observer;

/**
 * 被观察对象
 * @author sukyl
 *
 */
class AccountObservable extends Observable {
	
	private double sum = 0.0;
	private double expenses = 0.0;
	private double saving = 0.0;
	
	AccountObservable(double sum){ this.sum = sum;}
	
	public double getSum() {	return sum;}

	public double getExpenses() { return expenses;  }
	public void setExpenses(double expenses) { 
		clear();
		super.setChanged();
		this.expenses = expenses; 
		this.sum -= this.expenses;
	}
	public double getSaving() { return saving; }
	public void setSaving(double saving) { 
		clear();
		super.setChanged();
		this.saving = saving;
		this.sum += this.saving;
	}
	
	public void clear(){
		this.expenses = 0.0;
		this.saving = 0.0;
	}
	
}

/**
 * 支出观察者
 * @author sukyl
 *
 */
class ConsumeObserver implements Observer {

	@Override
	public void update(Observable o, Object arg) {
		if(arg instanceof AccountObservable){
			AccountObservable account = (AccountObservable)arg;	
			if(account.getExpenses()>0)
				System.out.println("-: "+account.getExpenses());
		}
	}

}

/**
 * 存款观察者
 * @author sukyl
 *
 */
class SavingObserver implements Observer {

	@Override
	public void update(Observable o, Object arg) {
		if(arg instanceof AccountObservable){
			AccountObservable account = (AccountObservable)arg;	  
			if(account.getSaving()>0)
				System.out.println("+: "+account.getSaving());
		}
		
	}
	
}

/**
 * 余额观察者
 * @author sukyl
 *
 */
class SumObserver implements Observer {

	@Override
	public void update(Observable o, Object arg) {
		if(arg instanceof AccountObservable){
			AccountObservable account = (AccountObservable)arg;	  
			System.out.println("sum: "+account.getSum());
		}		
	}	
}

/**
 * 测试
 * @author sukyl
 *
 */
public class ObserverTest {
	
	public static void main(String[] args){
		ConsumeObserver observer1 = new ConsumeObserver();
		SavingObserver observer2 = new SavingObserver();
		SumObserver observer3 = new SumObserver();
		
		AccountObservable account = new AccountObservable(800);
		account.addObserver(observer1);//注册观察者对象
		account.addObserver(observer2);
		account.addObserver(observer3);
		
		account.setExpenses(100);
		System.out.println("-- notify 1 --");
		account.notifyObservers(account);
		account.setSaving(20);
		System.out.println("-- notify 2 --");
		account.notifyObservers(account);
		System.out.println("-- notify 3 --");
		account.notifyObservers(account);
		
		System.out.println("-- notify 4 --");
		account.deleteObserver(observer3);//移除观察者对象
		account.setSaving(70);
		account.notifyObservers(account);
		
	}
}






 

    输出:


   -- notify 1 --
   sum: 700.0
   -: 100.0
   -- notify 2 --
   sum: 720.0
  +: 20.0
  -- notify 3 --
  -- notify 4 --
  +: 70.0



  



分享到:
评论

相关推荐

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

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

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

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

    Qt设计模式之观察者模式

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

    java观察者模式观察者模式

    观察者模式是设计模式中的一种行为模式,它在Java编程中有着广泛的应用。该模式的主要目的是定义对象之间的一对多依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并自动更新。这种模式也被...

    设计模式-观察者模式(讲解及其实现代码)

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

    Java内置观察者模式

    观察者模式(Observer Pattern)是设计模式中的一种行为模式,它允许一个对象,当其状态发生改变时,能够自动通知所有依赖它的其他对象。在Java中,这种模式已经被内置到语言核心,使得开发者可以轻松地实现事件驱动...

    设计模式--观察者模式java例子

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

    观察者模式模版和例子

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

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

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

    运用MVC模式及观察者模式的java小程序

    在这个名为“运用MVC模式及观察者模式的java小程序”的项目中,我们重点探讨了两种经典的设计模式:Model-View-Controller(MVC)模式和Observer(观察者)模式。这两种模式在JavaWeb开发中扮演着至关重要的角色。 ...

    iOS 设计模式 观察者模式

    观察者模式,也被称为发布-订阅(Publish-Subscribe)模式,是软件设计中的一种行为模式。在iOS开发中,它是一种让多个对象监听或订阅某一个主题对象的状态变化,并在状态变化时自动收到通知的方式。这种模式使得...

    56丨观察者模式(上):详解各种应用场景下观察者模式的不同实现方式1

    观察者模式详解 观察者模式(Observer Design Pattern)是行为型设计模式的一种,主要解决的是“类或对象之间的交互”问题。它定义了一个一对多的依赖关系,当一个对象的状态改变时,所有依赖的对象都会自动收到...

    观察者模式编写的股票分析程序

    观察者模式(Observer Pattern)是一种行为设计模式,它允许你定义一个订阅机制,可以在对象状态改变时通知多个“观察”该对象的其他对象。在这个"股票分析程序"中,我们很显然看到它利用了这种模式来实时更新股票...

    设计模式之观察者模式

    观察者模式是面向对象设计中的一种经典模式,它在软件工程中扮演着重要的角色,用于实现对象间的松耦合。这种模式定义了对象之间的一对多依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并...

    观察者模式源码

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

    观察者模式代码

    观察者模式是一种行为设计模式,它允许你定义一个订阅机制,可以在对象状态改变时通知多个“观察”该对象的其他对象。在Java或其他面向对象语言中,这种模式通常用于实现事件处理或发布/订阅系统。在给定的“观察者...

    观察者模式练习

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

    Unity3D设计模式之观察者模式

    ### Unity3D设计模式之观察者模式 #### 观察者模式概述 观察者模式(Observer Pattern)是一种软件设计模式,属于行为型模式之一。它定义了对象间的一种一对多依赖关系,当一个对象的状态发生改变时,所有依赖于它...

    观察者模式的一个应用

    ### 观察者模式概述与应用 #### 一、观察者模式定义 观察者模式是一种常用的软件设计模式,主要用于处理对象间的依赖关系。在这种模式下,一个对象(称为“主题”或“被观察者”)负责维护一组依赖于它的对象...

Global site tag (gtag.js) - Google Analytics