当前位置:首页 > 开发 > 编程语言 > 设计模式 > 正文

读《研磨设计模式》-代码笔记-观察者模式

发表于: 2012-09-26   作者:bylijinnan   来源:转载   浏览:
摘要: 声明: 本文只为方便我个人查阅和理解,详细的分析以及源代码请移步 原作者的博客http://chjavach.iteye.com/ import java.util.ArrayList; import java.util.List; import java.util.Observable; import java.util.Observer; /** * “观
声明:
本文只为方便我个人查阅和理解,详细的分析以及源代码请移步 原作者的博客http://chjavach.iteye.com/




import java.util.ArrayList;
import java.util.List;
import java.util.Observable;
import java.util.Observer;

/**
 * “观察者”这个说法有歧义,听来好像是观察者在主动监控,其实只是被动的等通知,并不能感知到目标有变化
 * 个人觉得观察者模式实现的关键,其实不在观察者而在被观察者,也就是Subject(目标):
 * Subject类负责通知观察者,负责观察者的加入和移除;而观察者只是被动的等待通知
 * 
 * 这样,实现的思路也就清晰了:
 * 1.Subject类持有一个Observer的列表(Observer可能有多个),并提供add和delete功能
 * 2.Observer如何接收通知呢:
 * 可以接收整个Subject,如update(Subject subject);可以只接收“通知”,例如update(String message)
 * 前者是拉模式,后者是推模式
 * 
 */
class Subject{
	
	private List<IObserver> observers = new ArrayList<IObserver>();
	
	public void attach(IObserver observer) {
		observers.add(observer);
	}
	
	public void detach(IObserver observer) {
		observers.remove(observer);
	}
	
	//拉模式。整个Subject传递过去,由Observer决定取Subject的哪部分内容
	//notifyObservers()不需要传递参数
	//可以对观察者作更精细的控制,例如只通知一部分观察者
	public void notifyObservers() {
		for (IObserver observer : observers) {
			observer.update(this);
		}
	}
	
	//推模式。直接推送Subject的详细信息,相当于广播。对应的Observer.update()也要更改
	//notifyObservers()传递参数:String content
	/*
	public void notifyObservers(String content) {
		for (IObserver observer : observers) {
			observer.update(content);
		}
	}
	*/
	
}


interface IObserver{
	void update(Subject subject);
}


class PaperSubject extends Subject {
	
	private String content;
	
	public void setContent(String content) {
		this.content = content;       //先更新内容,后通知
		notifyObservers();
	}
	
	public String getContent() {
		return this.content;
	}
	
}


class ReaderObserver implements IObserver {

	private String name;
	
	ReaderObserver(String name) {
		this.name = name;
	}
	
	//拉模式
	public void update(Subject subject) {
		PaperSubject s = (PaperSubject)subject;
		System.out.println(name + " got paper: " + s.getContent());
	}
	
	//推模式
	/*
	public void update(String content) {
		System.out.println(name + " got paper: " + content);
	}
	*/
	
}


/**
 * 利用JDK里面的Observable(目标)和Observer(观察者)实现观察者模式
 * 查看Observable的源码发现和上面的思路是一样的,不过Observable兼容了推模式和拉模式
 */
class PaperObservable extends Observable {
	
	private String content;

	public String getContent() {
		return content;
	}

	public void setContent(String content) {
		this.content = content;
		setChanged();
		notifyObservers();		//拉模式 源码里其实就是调用:notifyObservers(null)->update(this, null)
		setChanged();		//调用notifyObservers后会clearChanged
		notifyObservers(this.content);		//推模式->update(this, this.content)
	}
	
}

class ReaderObserver2 implements Observer {

	//如果observable提供公有方法可获取到obj,那有重复传递参数的嫌疑;但实际应用中可传递其他值
	public void update(Observable observable, Object obj) {
		if (obj == null) {
			PaperObservable o = (PaperObservable)observable;
			System.out.println("拉模式,自己动手获取:" + o.getContent());
		} else {
			System.out.println("推模式:" + obj);
		}
	}

}


public class ObserverPattern {
	public static void main(String[] args) {
		/*IObserver reader = new ReaderObserver("Tom");
		PaperSubject paper = new PaperSubject();
		paper.attach(reader);
		paper.setContent("paper new content!");*/
		
		Observer reader = new ReaderObserver2();
		PaperObservable paper = new PaperObservable();
		paper.addObserver(reader);
		paper.setContent("paper new content!");
	}
}




读《研磨设计模式》-代码笔记-观察者模式

  • 0

    开心

    开心

  • 0

    板砖

    板砖

  • 0

    感动

    感动

  • 0

    有用

    有用

  • 0

    疑问

    疑问

  • 0

    难过

    难过

  • 0

    无聊

    无聊

  • 0

    震惊

    震惊

编辑推荐
_notifiers = new HashMap<Class<?>, Notifier>(); xxDemo中 Notifier notifier = getN
观察者模式(Observer)又叫发布-订阅(Public/Subscribe)模式. 观察者模式定义了一种一对多的依赖关系
意图: 定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时, 所有依赖于它的对象都得到
一、模式定义 观察者模式定义了对象之间的一对多依赖关系,这样一来,当一个对象改变状态时,它的所
1. 概述   有时被称作发布/订阅模式,观察者模式定义了一种一对多的依赖关系,让多个观察者对象同
1.1  定义   定义了一种一对多的依赖关系,让多个观察者同时监听一个对象,但这个对象发生变化
观察者模式 又叫发布-订阅模式 源-监听器模式 从属模式等等 观察者模式定义了一种一对多的依赖关系
观察者模式(Observer)定义对象间的一对多的依赖关系,以便当一个对象改变时,所有依赖于它的对象都
1. 概述   有时被称作发布/订阅模式,观察者模式定义了一种一对多的依赖关系,让多个观察者对象同
1. 概述   有时被称作发布/订阅模式,观察者模式定义了一种一对多的依赖关系,让多个观察者对象同
版权所有 IT知识库 CopyRight © 2009-2015 IT知识库 IT610.com , All Rights Reserved. 京ICP备09083238号