Observer pattern 观察者模式

一、认识观察者模式

我们看看报纸和杂志的订阅是怎么回事:

1、报社的业务就是出版报纸。

2、向某家报社订阅报纸,只要他们有新的报纸出版,就会给你送来,只要你是他们的订户,你就会一直收到报纸。

3、当你不想在看到报纸的时候,取消订阅,他们就不会送新的报纸来。

4、只要报社还在运营,就会一直有人或单位向他们订阅报纸或取消订阅报纸。

出版者+订阅者=观察者模式  

如果你了解报纸的订阅是怎么回事,其实就知道观察者模式是怎么回事,只是名字不太一样:出版者改称为“主题”(subject),订阅者改称为“观察者”(Observer)。

让一张图来看得仔细一定:

上图中鸭子对象不是观察者,所有在主题数据改变时不会被通知,像你没有订阅报纸业务,报社有新的报纸出版时也不会发给你报纸一样,如果鸭子对象想成为观察者就需要告诉主题,它想当一个观察者。通过注册(订阅)告诉主题。

观察者模式定义:

  定义了对象之间的一对多依赖,这样一来,当一个对象改变状态使,它所有的依赖对象都会收到通知并自动更新。

松耦合:当两个对象之间松耦合,它们依然可以交互,但是不太清楚彼此之间的细节。

观察者模式提供了一种对象设计,让主题和观察者之间松耦合。

设计原则:为了交互对象之间的松耦合设计而努力。

实例代码:

/**
 * 设计气象站
 * 观察者模式:
 * 		这是主题接口,对象使用此接口注册为观察者,或者把自己从观察者中删除
 * @author Administrator
 *
 */
public abstract  class Subject {
	/**
	 * 通过此方法注册为观察者
	 * @param obj
	 */
	public abstract void registerObserver(Observer obj);
	/**
	 * 通过此方法取消注册。
	 * @param obj
	 */
	public abstract void removeObserver(Observer obj);
	/**
	 * 通过所有观察者更新信息
	 */
	public abstract void notifyObserver();

}

/**
 * 观察者接口,所有观察者都需要实现此接口,这样主题在需要通知观察者
 * 时,有了一个共同的接口。
 *
 */
public interface Observer {

	public void update();

}

/**
 * 一个具体主题,总是实现主题接口
 * 除了注册和撤销方法之外,具体主题还实现了notifyObserver方法,此方法用于在状态改变时更新所有观察者。
 * @author Administrator
 *
 */
public class ConcreateSubject extends Subject {

	//加上一个list来记录观察者。
	private  ArrayList observer; 

	public ConcreateSubject() {
		observer=new ArrayList();
	}

	@Override
	public void registerObserver(Observer obj) {
		observer.add(obj);
	}

	@Override
	public void removeObserver(Observer obj) {
		observer.remove(obj);
	}

	@Override
	public void notifyObserver() {
		for (int i = 0; i < observer.size(); i++) {
			Observer obs=(Observer) observer.get(i);
			//更新所有观察者最想信息
			obs.update();
		}
	}

}

/**
 * 具体观察者
 *
 */
public class ConcreaeObserver implements Observer {

	private Subject subject;
	/**
	 * 可在构造函数里面注册观察者
	 */
	public ConcreaeObserver(Subject subject) {
		this.subject=subject;
		this.subject.registerObserver(this);
	}

	@Override
	public void update() {
		// TODO Auto-generated method stub
		System.out.println("我是观察者1号.......................");
	}

}

/**
 * 具体观察者
 * @author Administrator
 *
 */
public class ConcreaeObserverA implements Observer {

	private Subject subject;
	/**
	 * 可在构造函数里面注册观察者
	 */
	public ConcreaeObserverA(Subject subject) {
		this.subject=subject;
		this.subject.registerObserver(this);
	}

	@Override
	public void update() {
		// TODO Auto-generated method stub
		System.out.println("我是观察者2号.......................");
	}

}

 

/**
 * 测试观察者模式
 * 在对象之间定义一对多的依赖,这样当一个对象发生改变状态,其依赖对象都会收到通知更新状态。
 *
 */
public class TestObserver {
    public static void main(String[] args) {
        ConcreateSubject subject = new ConcreateSubject();

        ConcreaeObserver observer = new ConcreaeObserver(subject);// 注册观察者
        ConcreaeObserverA observerA = new ConcreaeObserverA(subject);// 注册观察者
        /*subject.registerObserver(observer);// 注册观察者
*/        //subject.registerObserver(observerA);// 注册观察者

        subject.notifyObserver();// 通知所有观察者更新信息

    }

}

输出结果:

我是观察者1号.......................
我是观察者2号.......................

Java API有内置的观察者模式。Java.util包(package)内包含基本的Observer接口与Observerable类,这和我们的subject接口与observer接口很相似,Observer接口与Observerable类使用上更方便,因为许多功能已经事先准备好了。你甚至可以使用推(push)或拉(pull)的方式传送数据。

时间: 2024-10-09 11:23:50

Observer pattern 观察者模式的相关文章

设计模式(二)The Observer Pattern 观察者模式

问题引入 生成一个公告板显示当时的天气状况,当天气状况发生改变的时候公告板能够实时的更新. 模式定义 定义对象之间的一对多的依赖.当一个对象改变状态时,它的全部依赖者都会自己主动收到通知并自己主动更新. 认识模式 该模式在生活中是非经常见的.想想生活中的各种各样的检測系统,报警系统,一旦有重要事件发生时,有关系统总能及时的收到通知.这就是观察者模式. 问题解决 关于观察者模式,java实际上给了我们内置的支持(能够看出该模式还是非经常常使用的吧!)可是我们经常会自己实现. 为什么呢?我们后面会给

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

1.Subject通过一个容器保存零到多个Observer. 2.Subject通过Add,Delete方法调整Observer. 3.Subject的notifyObservers方法实际是逐个调用容器中Observer的notify方法.

【设计模式】观察者模式 Observer Pattern

定义:观察者模式定义了对象之间的一对多依赖.当“主题”(Object)状态改变事,所有依赖它的“观察者”(Observer)都会受到通知并自动更新.主题支持观察者订阅和退订. 观察者模式提供了一种对象设计,让主题和观察者之间松耦合.改变主题或观察者一方不会影响另一方.因为两者是松耦合的. 参考: 设计模式学习笔记--Observer Pattern观察者模式

Head First 之 Design Pattern(二):Observer Pattern

观察者模式是最常用的设计模式之一,[对象之间多对一的依赖关系,当一个对象发生变化时,其会通知所有依赖它的对象].拿订阅报纸和发行报社打比方,报社采集到news制作新的报纸,派送给订阅的客户,以此把最新的消息告知客户.所以,出版社 + 订阅者 = 观察者模式. 这种一对多的关系,也即"一个"主题."多个"观察者能够使得观察者仅仅了解主题推送的消息但不知晓其中的细节,而主题握有观察者列表但不干涉到观察者的个人隐私.所以,它们之间相互有交互,但不紧密,不清楚对方的细节.改

Design Pattern: Observer Pattern

1. Brief 一直对Observer Pattern和Pub/Sub Pattern有所混淆,下面打算通过这两篇Blog来梳理这两种模式.若有纰漏请大家指正. 2. Use Case 首先我们来面对一个老到跌渣的故事,并以从未听说过Observer Pattern为前提. 假设要设计一个新闻订阅系统,新闻分为商业.体育和八卦3种,而查收终端有PC.移动终端等,后续还不断增加新闻种类和查收终端. 需求如上,下面我们根据OOD的方式来构建概念模型. 新闻 <- 分类新闻 终端 <- 分类终端

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

先看下观察者模式的定义: The Observer Pattern defines a one-to-many denpendency between objects so that when one object changes state, all of its dependents are notified and updated automatically.:观察者模式定义了对象间一对多依赖关系,使得当一个对象改变状态,则所有依赖于它的对象都会得到通知并被自动更新. 观察者模式又叫发布-

设计模式 - 观察者模式(Observer Pattern) 详解

观察者模式(Observer Pattern) 详解 本文地址: http://blog.csdn.net/caroline_wendy/article/details/26583157 版权所有, 禁止转载, 如有转载, 请站内联系. 观察者模式(Observer Pattern): 定义了对象之间的一对多的依赖, 这样一来, 当一个对象改变状态时, 它的所有依赖者都会收到通知并自动更新. 使用方法: 1. 首先新建主题(subject)接口, 负责注册(register)\删除(remove

设计模式 - 观察者模式(Observer Pattern) Java内置 使用方法

观察者模式(Observer Pattern) Java内置 使用方法 本文地址: http://blog.csdn.net/caroline_wendy/article/details/26601659 观察者模式(observer pattern)详解, 参见: http://blog.csdn.net/caroline_wendy/article/details/26583157 Java内置的观察者模式, 是通过继承父类, 实现观察者模式的几个主要函数: Observerable(可被观

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

今天看了看观察者模式,有点小小的体会,从以下3点说明之 : 1.看一下经典的观察者模式图 2.讲个故事,说一下逻辑 有一个男人(Subject),他通过一定的手段(attach)拥有了3个女人(Observer):老婆(concreteObserver1),情人(concreteObserver2),小3(concreteObserver3).这3个女人都不知情,但是都想知道男人的月收入情况.而月收入需要通过工资卡(concreteSubject)来体现.所以,每当发工资(setState)时,