`

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

阅读更多
声明:
本文只为方便我个人查阅和理解,详细的分析以及源代码请移步 原作者的博客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!");
	}
}




分享到:
评论

相关推荐

    研磨设计模式-配套源代码

    这份压缩包可能包括了多种常见设计模式的实现,如单例模式、工厂模式、观察者模式、装饰器模式等,通过源代码的形式帮助开发者更好地理解和应用这些模式。 1. **单例模式**:确保一个类只有一个实例,并提供一个...

    研磨设计模式-配套源代码.7z

    《研磨设计模式》是一本深入探讨软件设计模式的书籍,其配套源代码包含了许多经典设计模式的实际应用示例。这些源代码可以帮助读者更直观地理解设计模式的原理和使用方法,进一步提升软件开发能力。 设计模式是软件...

    研磨设计模式-配套源代码.rar

    《研磨设计模式》是一本深入探讨软件设计模式的书籍,配套源代码是作者为了帮助读者更好地理解和应用书中介绍的设计模式而提供的实践示例。设计模式是软件开发中经过实践检验的、解决常见问题的模板,它为软件设计...

    研磨设计模式-配套源代码 UTF-8格式

    《研磨设计模式》是一本深入探讨软件设计原则与实践的经典书籍,其配套源代码提供了丰富的实例,帮助读者更好地理解和应用各种设计模式。这个UTF-8格式的压缩包包含了书中介绍的各种设计模式的实现,是学习和研究...

    研磨设计模式-陈臣.epub

    “1.1 设计模式是什么 1.1.1 什么是模式 从字面上理解,模,就是模型、模板的意思;式,就是方式、方法的意思。综合起来,所谓模式就是:可以作为模型或模板的方式或方法。... “研磨设计模式”。 iBooks.

    研磨设计模式--chjavach的博客文章

    研磨设计模式的过程是持续学习和实践的过程,chjavach的博客文章提供了深入探讨这些模式的宝贵资源,值得我们仔细阅读和学习。通过深入理解和运用这些设计模式,可以提升个人的编程技巧,同时也为团队合作和项目维护...

    研磨设计模式-陈臣pdf

    《研磨设计模式》完整覆盖GoF讲述的23个设计模式并加以细细研磨。初级内容从基本讲起,包括每个模式的定义、功能、思路、结构、基本实现、运行调用顺序、基本应用示例等,让读者能系统、完整、准确地掌握每个模式,...

    研磨设计模式-陈臣.王斌.扫描高清版PDF

    设计模式(Design Pattern)是一套被反复使用、多数人知晓的、经过分类的、代码设计经验的总结。 使用设计模式的目的:为了代码可重用性、让代码更容易被他人理解、保证代码可靠性。 设计模式使代码编写真正工程化;...

    研磨设计模式书-配套源代码(全)

    1:本源代码是《研磨设计模式》一书的配套源代码 2:每个模式的示例源代码放在一个单独的文件夹下,以该模式的英文名称命名 3:每个模式下分成多个example,按照书的示例顺序分别命名为example1、example2.........

    研磨设计模式-陈臣.mobi kindle版

    《研磨设计模式》完整覆盖GoF讲述的23个设计模式并加以细细研磨。初级内容从基本讲起,包括每个模式的定义、功能、思路、结构、基本实现、运行调用顺序、基本应用示例等,让读者能系统、完整、准确地掌握每个模式,...

    研磨设计模式源码

    《研磨设计模式源码》是一份非常宝贵的资源,它提供了设计模式的实践代码,帮助开发者深入理解并应用这些模式。设计模式是软件工程中经过长期实践总结出来的一套通用解决方案,它们描述了在特定场景下如何解决常见...

    研磨设计模式 源代码

    《研磨设计模式》是一本深入探讨软件设计模式的经典书籍,源代码包含了书中所讲解的各种设计模式的实际应用示例。设计模式是软件工程中的重要概念,它们是经过反复验证、在特定情境下解决常见问题的有效解决方案。...

    研磨设计模式-part2

    《研磨设计模式》完整覆盖GoF讲述的23个设计模式并加以细细研磨。初级内容从基本讲起,包括每个模式的定义、功能、思路、结构、基本实现、运行调用顺序、基本应用示例等,让读者能系统、完整、准确地掌握每个模式,...

    研磨设计模式-part4

    《研磨设计模式》完整覆盖GoF讲述的23个设计模式并加以细细研磨。初级内容从基本讲起,包括每个模式的定义、功能、思路、结构、基本实现、运行调用顺序、基本应用示例等,让读者能系统、完整、准确地掌握每个模式,...

    研磨设计模式-part3

    《研磨设计模式》完整覆盖GoF讲述的23个设计模式并加以细细研磨。初级内容从基本讲起,包括每个模式的定义、功能、思路、结构、基本实现、运行调用顺序、基本应用示例等,让读者能系统、完整、准确地掌握每个模式,...

    研磨设计模式全部源代码

    这个压缩包“研磨设计模式全部源代码”包含了多种设计模式的实现,这些模式可以帮助开发者写出更可维护、可扩展和可复用的代码。下面将详细讲解其中可能包含的一些重要设计模式及其应用。 1. 工厂模式:这是最简单...

    研磨设计模式带书签完整版228M.7z.001

    《研磨设计模式》完整覆盖GoF讲述的23个设计模式并加以细细研磨。初级内容从基本讲起,包括每个模式的定义、功能、思路、结构、基本实现、运行调用顺序、基本应用示例等,让读者能系统、完整、准确地掌握每个模式,...

    研磨设计模式(完整带书签).part2.pdf

    《研磨设计模式》完整覆盖GoF讲述的23个设计模式并加以细细研磨。初级内容从基本讲起,包括每个模式的定义、功能、思路、结构、基本实现、运行调用顺序、基本应用示例等,让读者能系统、完整、准确地掌握每个模式,...

    研磨设计模式[书签]

    《研磨设计模式》是由陈臣和王斌合著,由清华大学出版社出版的一本深入探讨设计模式的专业书籍。设计模式是软件工程中的一个重要概念,它代表了在特定上下文中解决问题的常见方法,经过时间和实践的验证,具有很高的...

    研磨设计模式PDF

    《研磨设计模式》这本书是陈臣和王斌两位作者合作的成果,专注于讲解软件设计中的模式应用。设计模式是软件工程中的一种最佳实践,它总结了在特定上下文中解决问题的常见方法,使得开发者可以复用这些解决方案,提高...

Global site tag (gtag.js) - Google Analytics