观察者模式及Java实现例子

http://www.cnblogs.com/mengdd/archive/2013/02/07/2908929.html

观察者模式

观察者模式 Observer

  观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。

  这个主题对象在状态上发生变化时,会通知所有观察者对象,让它们能够自动更新自己。

观察者模式的组成

  抽象主题角色:把所有对观察者对象的引用保存在一个集合中,每个抽象主题角色都可以有任意数量的观察者。抽象主题提供一个接口,可以增加和删除观察者角色。一般用一个抽象类和接口来实现。

  抽象观察者角色:为所有具体的观察者定义一个接口,在得到主题的通知时更新自己。

  具体主题角色:在具体主题内部状态改变时,给所有登记过的观察者发出通知。具体主题角色通常用一个子类实现。

  具体观察者角色:该角色实现抽象观察者角色所要求的更新接口,以便使本身的状态与主题的状态相协调。通常用一个子类实现。如果需要,具体观察者角色可以保存一个指向具体主题角色的引用。

程序实例

  通过程序实例来说明观察者模式:

  首先定义抽象的观察者:

//抽象观察者角色
public interface Watcher
{
    public void update(String str);

}

  然后定义抽象的主题角色,即抽象的被观察者,在其中声明方法(添加、移除观察者,通知观察者):

//抽象主题角色,watched:被观察
public interface Watched
{
    public void addWatcher(Watcher watcher);

    public void removeWatcher(Watcher watcher);

    public void notifyWatchers(String str);

}

  然后定义具体的观察者:

public class ConcreteWatcher implements Watcher
{

    @Override
    public void update(String str)
    {
        System.out.println(str);
    }

}

  之后是具体的主题角色: 

import java.util.ArrayList;
import java.util.List;

public class ConcreteWatched implements Watched
{
    // 存放观察者
    private List<Watcher> list = new ArrayList<Watcher>();

    @Override
    public void addWatcher(Watcher watcher)
    {
        list.add(watcher);
    }

    @Override
    public void removeWatcher(Watcher watcher)
    {
        list.remove(watcher);
    }

    @Override
    public void notifyWatchers(String str)
    {
        // 自动调用实际上是主题进行调用的
        for (Watcher watcher : list)
        {
            watcher.update(str);
        }
    }

}

  编写测试类:

public class Test
{
    public static void main(String[] args)
    {
        Watched girl = new ConcreteWatched();

        Watcher watcher1 = new ConcreteWatcher();
        Watcher watcher2 = new ConcreteWatcher();
        Watcher watcher3 = new ConcreteWatcher();

        girl.addWatcher(watcher1);
        girl.addWatcher(watcher2);
        girl.addWatcher(watcher3);

        girl.notifyWatchers("开心");
    }

}

参考资料

  张龙老师Java SE系列视频教程。

  本博客中关于观察者模式的相关文章:

  http://www.cnblogs.com/mengdd/archive/2012/09/08/2676587.html

  http://www.cnblogs.com/mengdd/archive/2013/01/03/2843298.html

时间: 2024-11-10 20:33:28

观察者模式及Java实现例子的相关文章

复习java的例子(第一天)

1. 编写程序:从键盘上读入一个学生成绩, 存放在变量score中,根据score的值输出其对应的成绩等级: score>=90 等级: A 70=<score<90 等级: B 60=<score<70 等级: C score<60 等级: D import java.util.Scanner; public class Course{ public static void main(String []arg){ Scanner scanner = new Scann

Java多线程例子讲解

一:知识点声明: 1.区别进程和线程:进程是静态概念,它的执行依赖线程进行. 2.进程的状态:就绪(等待cpu执行),运行,中止,阻塞(等待所需资源,进入阻塞态) 3.Java程序的main函数即是一个线程,被称做主线程.此时如果新建线程,则和主线程一起并行运行. 4.Java中的构造方法.main函数谁先执行? main函数先执行,因为main是静态方法,程序一开始就执行:而构造方法只有在类实例化时才去调用. 二:实例程序 public class GetCurrentThread imple

Jsonp和java操作例子

介绍JSONP之前,先简单的介绍一些JSON.JSON是JavaScript Object Notation的缩写,是一种轻量的.可读的基于文本的数据交换开放标准.源于JavsScript编程语言中对简单数据结构和关联数组的展示功能.它是仅含有数据对和简单括号结构的纯文本,因此可通过许多途径进行JSON消息的传递. 1. JSONP定义    JSONP是英文JSON with Padding的缩写,是一个非官方的协议.它允许在服务器端生成script tags返回至客户端,通过javascri

java 多线程例子

java 多线程例子 编写具有多线程能力的程序经常会用到的方法有: run(), start(), wait(), notify(), notifyAll(), sleep(), yield(), join() 还有一个重要的关键字:synchronized 本文将对以上内容进行讲解. 一:run() 和start() 示例1: public class ThreadTest extends Thread {public void run() {for (int i = 0; i < 10; i

java线程例子登山

Through its implementation, this project will familiarize you with the creation and execution of threads, and with the use of the Thread class methods. In order to synchronize the threads you will have to use (when necessary), run( ), start( ), curre

一个基于RSA算法的Java数字签名例子

原文地址:一个基于RSA算法的Java数字签名例子 一.前言: 网络数据安全包括数据的本身的安全性.数据的完整性(防止篡改).数据来源的不可否认性等要素.对数据采用加密算法加密可以保证数据本身的安全性,利用消息摘要可以保证数据的完整性,但是还有一点就是数据来源的不可否认性(也就是数据来自哪里接收者是清楚的,而且发送数据者不可抵赖). 有些方案曾经使用消息认证码(MAC)来保证数据来源于合法的发送着,但是利用消息认证码会带来一个问题,就是通讯双方必须事先约定两者之间的通讯用共享密码.在我们的互联网

java 小例子

1.创建第一个java web例子 mac 下 使用eclipse创建第一个web页面,很简单  file->new->web project 会出现完整的java web项目: 2.在jsp页面加入后台java类的方法,并显示在页面上 a.创建一个java类 在src上点击右键,new->class  创建一个java类,Demo类,创建一个方法 getHello,如下所示: package tests; public class Demo { public String GetHel

观察者模式和java委托

观察者模式与java委托 所谓观察者模式,指的是在某种情况下需要同时触发一系列相关操作,它存在观察者和通知者两个概念,通知者持有观察者的抽象类的集合,可以调用所有观察者的特定方法以更新状态,同时观察者也可持有通知者的抽象对象以获取具体通知者的特有信息. 观察者模式的不足:虽然观察者模式提取出了抽象观察者和通知者,让类与类之间不互相依赖,共同依赖于抽象接口,符合依赖倒转,但他任需要依赖于抽象接口,而且有些时候观察者无法继承抽象观察者(比如引用jar包). java委托机制与观察者模式:委托机制的实

新手码农浅谈观察者模式(java语言简单实现)

一:什么是观察者模式: 官方定义:定义对象间一种一对多的依赖关系.当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新. 举个例子,很多人都会订阅天气预报,当气象台获得明天的天气情况(目标对象)时,就会短信通知订阅了天气预报的人(观察者),然后订阅者就会根据明天天气情况做出相应的处理(呆在家?出去踏青?出去购物...) 二:观察者模式的两个角色: 第一个角色:目标对象(subject),被观察者关注的对象,它的改变引起观察者的改变,例如上面提到的天气情况. 第二个角色:观察者(o