`

Java观察者模式(Observer)详解及应用

    博客分类:
  • java
阅读更多


Java观察者模式(Observer)详解及应用

由于网站带有弱sns功能,因此需要设计关注和被关注的消息或是动作通知,那么将这个需求抽象出来的时候就会发现正好符合java中 订阅者模式,我还是喜欢叫观察着模式,具体网站的实现代码就不写了,写一个简单的例子大家了解下即可

一、概述

Java的设计模式很多,观察者模式被称为是模式中的皇后,而且Java jdk也对它做了实现,可见该设计模式的重要位置。在图形化设计的软件中,为了实现视图和事件处理的分离,大多都采用了Observer模式,比如Java的Swing,Flex的ActionScript等。在现实的应用系统中也有好多应用,比如像当当网、京东商城一类的电子商务网站,如果你对某件商品比较关注,可以放到收藏架,那么当该商品降价时,系统给您发送手机短信或邮件。这就是观察者模式的一个典型应用,商品是被观察者,有的叫主体;关注该商品的客户就是观察者。下面的一个事例将模拟这个应用。



GoF说道:Observer模式的意图是“定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新”。从这段话里我们可以得到两个信息,如下:



1, 观察者(具体执行操作的对象,有多个)

2, 被观察者(顾名思义是被观察的对象,如果该对象发生某些变化则通知观察者执行对应的操)



二、jdk中观察者模式解析



在java的util包中实现了该设计模式的框架,大部分应用都可以直接用它,当然了你也可以自己实现它,实际上就是一个被观察者的抽象类和一个观察者接口。我们先看一下jdk是如何实现的。被观察者的抽象类java.util.Observable



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

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();
}
}

当我们自己的被观察者继承这个Observable类是,我们就自动的获取到被观察者的一切条件了。很方便是不是,这也是为什么sun要把Observable放到java.util包中的原因,就是为了方便开发者。

下面我们再看一下观察者的接口java.util.Observer
package java.util;
public interface Observer {

void update(Observable o, Object arg);

}

接口中就只有一个方法,update,方法中有两个参数,Observable和一个object,第一个参数就是被观察的对象,而第二个参数就得看业务需求了,需要什么就传进去什么。我们自己的观察者类必须实现这个方法,这样在被观察者调用notifyObservers操作时被观察者所持有的所有观察者都会执行update操作了.



三、观察者模式应用



下面是一个book对象,它是一个被观察者,所以要继承Observable。

import java.util.Observable;

public class Book extends Observable {



private String name = "";

private double price = 0.0;

public String getName() {

return name;

}

public void setName(String name) {

this.name = name;

}



public double getPrice() {

return price;

}

public void setPrice(double price) {

this.price = price;

}

//当书的价格修改时调用该方法

public void modifyPrice(Book b) {

//调用父类的方法,改变被观察者的状态

setChanged();

//通知客户该书已降价

notifyObservers(b);

}



}



下面是观察者对象,表示顾客的电子邮件,它实现了Observer接口。

import java.util.Observable;

import java.util.Observer;

public class BuyerEmail implements Observer {



private String buyerId = "";

private String email = "";



public String getBuyerId() {

return buyerId;

}

public void setBuyerId(String buyerId) {

this.buyerId = buyerId;

}

public String getEmail() {

return email;

}

public void setEmail(String email) {

this.email = email;

}

//该方法会被“被观察者的父类”既Observable调用

public void update(Observable o, Object arg) {

//这里做具体发电子邮件的操作

Book b = (Book)arg;

System.out.println("给顾客的发电子邮件:"+b.getName()+"降价了,目前价格为:"+b.getPrice());

}

}



下面是另一个观察者对象,表示顾客的手机,同样需要继承Observer接口

import java.util.Observable;

import java.util.Observer;

public class BuyerMobileMessage implements Observer {



private String buyerId = "";

private String mobileNo = "";



public String getBuyerId() {

return buyerId;

}

public void setBuyerId(String buyerId) {

this.buyerId = buyerId;

}

public String getMobileNo() {

return mobileNo;

}

public void setMobileNo(String mobileNo) {

this.mobileNo = mobileNo;

}

public void update(Observable o, Object arg) {

// TODO Auto-generated method stub

Book b = (Book)arg;

System.out.println("给顾客的发手机短信:"+b.getName()+"降价了,目前价格为:"+b.getPrice());

}

}



下面是调用类:



public class MainApp {



public static void main(String args[])

{

Book b1 = new Book();

b1.setName("<<Java设计模式>>");

b1.setPrice(45.00);//假设原价是60,现在是降价促销



//下面的观察者在实际的应用中可以从数据库或文件中读取

BuyerMobileMessage bm = new BuyerMobileMessage();

bm.setBuyerId("001");

bm.setMobileNo("13810500085");



BuyerEmail be = new BuyerEmail();

be.setBuyerId("001");

be.setEmail("dobodo@163.com");



//增加观察者,在实际应用中就是那些人对该书做了关注

b1.addObserver(bm);

b1.addObserver(be);



b1.modifyPrice(b1);

}

}



输出:

给顾客的发电子邮件:<<Java设计模式>>降价了,目前价格为:45.0

给顾客的发手机短信:<<Java设计模式>>降价了,目前价格为:45.0



不知道上面的例子你看懂了没有,观察者模式实际上没什么高深的东西,就是运用了java的继承和接口,在被观察者的抽象类里设置一个状态标志,通过该标志判断是否通知观察者对象。在学习该模式的同时,我们更应该学习java的继承和接口的灵活应用,其实所有的设计模式都是继承、接口、多态的灵活应用
6
3
分享到:
评论
4 楼 zhdkn 2012-10-26  
顶一个,最近也在学习设计模式,发现一个问题,如果老是看别人的博客或者学习笔记很难真正理解设计模式,自己必须认真研究后再去看别人的总结,这样收获还是蛮多的。
3 楼 walldr2161 2011-12-15  
       多谢楼主分享心得
2 楼 newto 2011-12-14  
1 楼 jy02432443 2011-12-14  
写的不错,通俗易懂 我总结下就是
Observable 被观察者 (类)
方法:添加观察者,删除观察者,通知观察者更新
Observable中使用Vector而不使用ArrayList 因为需要多线程同步
Observable有一个标志位  观察者更新的时候需要判断此标志位来做相应的事情


Observer   观察者(接口)方法:void update(Observable o, Object arg);
使用接口的原因我们应该理解为给自己的类添加一种Observer功能而不是吧自己的类当成观察者抽象类



相关推荐

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

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

    Java 观察者模式的浅析

    ### Java观察者模式详解 #### 一、观察者模式概述 观察者模式是一种常用的设计模式,主要用于处理对象间的一对多依赖关系。当一个对象(主题)的状态发生变化时,所有依赖于它的对象(观察者)都会收到通知并自动...

    详解Observer Pattern(观察者模式)在Java中的使用原理

    我们说学习Java应该从Swing开始,那么学习Swing最重要的思想就是对于观察者模式的理解(Observer Pattern)。因为,该设计模式在Java Swing框架中贯穿了始终。对于C#的委托、代理概念所使用的Callback(回调模式--...

    观察者(Observer)模式详解

    例如,在Java中,`java.util.Observable`和`java.util.Observer`类就提供了观察者模式的实现。此外,许多现代编程语言和框架,如JavaScript的事件监听、C#的委托和事件、Android的BroadcastReceiver,都采用了观察者...

    java 观察者模式 (Observe)

    ### Java观察者模式详解 #### 引言:深入探索观察者模式 观察者模式(Observer)是设计模式中的一种常用模式,它定义了一种一对多的依赖关系,使得多个观察者对象可以同时监听某一主题对象。当主题对象的状态发生...

    java常用设计模式-观察者模式

    Java 观察者模式详解 观察者模式(Observer Pattern)是一种行为设计模式,它定义了一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖它的对象都会得到通知并自动更新。该模式适用于需要在对象间建立...

    观察者模式详解(JDK中最重要的模式)

    ### 观察者模式详解(JDK中最重要的模式) #### 概述 观察者模式是一种设计模式,它定义了一种一对多的关系,使得多个观察者对象可以同时监听某个主题对象。当主题对象的状态发生变化时,它会通知所有的观察者对象...

    java 设计模式详解

    Java.util.Observable和Observer接口就是观察者模式的实现。 10. 装饰模式:装饰模式动态地给一个对象添加一些额外的职责。它提供了比继承更多的灵活性,避免了因为功能增加而导致类的急剧膨胀。 以上只是部分设计...

    Java编程之内置观察者模式实例详解

    Java编程之内置观察者模式实例详解主要介绍了Java编程之内置观察者模式,结合实例形式较为详细的分析了java内置观察者模式的原理、实现方法及相关注意事项。 一、观察者模式的概念 观察者模式是一种行为型设计模式...

    java设计模式之观察者模式

    **Java设计模式之观察者模式详解** 在软件工程中,设计模式是一种被广泛接受的解决常见问题的方法。观察者模式(Observer Pattern)是行为设计模式的一种,它定义了对象之间的一对多依赖关系,当一个对象的状态发生...

    掌握Java中的观察者模式:实现动态交互的秘籍

    ### Java中的观察者模式详解与应用场景 #### 一、引言 随着软件系统的复杂度不断增加,如何有效地管理和响应系统内部的变化成为了软件工程师面临的重要问题之一。观察者模式作为一种经典的设计模式,提供了一种优雅...

    设计模式-观察者模式(读书笔记)

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

    java23种设计模式详解+源码(绝对详解)

    - 观察者模式(Observer):定义对象之间的一对多依赖关系,当一个对象的状态改变时,所有依赖于它的对象都会得到通知并自动更新。 - 状态模式(State):允许对象在其内部状态改变时改变它的行为,对象看起来似乎...

    观察者模式框架

    ### 观察者模式框架详解 #### 一、观察者模式概述 观察者模式(Observer Pattern)是一种行为设计模式,它定义了对象间的一种一对多依赖关系,以便当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并...

    Java设计模式—观察者模式详解

    Java设计模式—观察者模式详解 观察者模式是 Java 设计模式中的一种重要模式,用于定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。 观察者模式的定义...

    详解Java编程的Observer观察者设计模式

    观察者设计模式是一种行为设计模式,它允许你定义一个订阅机制,可以在对象状态改变时通知多个“观察者...通过`java.beans`包中的接口和类,开发者可以轻松地在应用中实现观察者模式,从而实现动态的依赖和实时的通知。

    java24种设计模式详解

    - **观察者模式(Observer)**:定义对象间的一对多依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并被自动更新。 - **责任链模式(Chain of Responsibility)**:避免将处理请求的责任硬...

    Java观察者设计模式详解

    Java观察者设计模式是一种行为设计模式,它定义了对象之间的一对多依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并自动更新。这种模式常用于事件处理系统,将观察者与被观察对象解耦,使得...

Global site tag (gtag.js) - Google Analytics