设计模式入门之观察者模式Observer

//观察者模式定义:定义对戏那个间的一种一对多的依赖关系
//当一个对象的状态发生改变时,所有依赖它的对象都得到通知并被自动更新
//实例:用户订阅报纸,当报社出版新报纸时,通知所有的订阅者
//直接上代码,为了理解过程,先上原始代码
//目标对象
public class Subject {
	private List<Observer> readers = new ArrayList<Observer>();
	public void attach(Observer reader) {
		readers.add(reader);
	}
	public void detach(Observer reader) {
		readers.remove(reader);
	}
	protected void notifyObservers() {
		for(Observer reader : readers) {
			reader.update(this);
		}
	}
}
//报纸对象,具体的目标实现
public class NewsPaper extends Subject {
	private String content;
	public String getContent() {
		return content;
	}
	public void setContent(String content) {
		this.content = content;
		notifyObservers();
	}
}
//观察者,比如报纸的读者
public interface Observer {
	public void update(Subject subject);
}
//真正的读者
public class Reader implements Observer {
	private String name;
	public void update(Subject subject) {
		System.out.println(name+"收到报纸了,阅读它。内容是:"+((NewsPaper)subject).getContent());
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
}

public class Client {
	public static void main(String[] args) {
		NewsPaper subject = new NewsPaper();
		Reader reader1 = new Reader();
		reader1.setName("张三");
		Reader reader1 = new Reader();
		reader1.setName("李四");
		Reader reader1 = new Reader();
		reader1.setName("王五");
		subject.attach(reader1);
		subject.attach(reader2);
		subject.attach(reader3);
		//新报纸出版了
		subject.setContent("本期内容是观察者模式");
	}
}
//推模型和拉模型,以上的例子是拉模式
//因为直接把目标对象给观察者了,可以自由拉取
//推模型:修改代码
public interface Observer {
	public void update(String content);
}
public class Reader implements Observer {
	public void pudate(String content) {
		System.out.println(name+"收到报纸了,阅读他,内容是:"+content);
	}
}
public class Subject {
	protected void notifyObservers(String content) {
		for(Observer reader : readers) {
			reader.update(content);
		}
	}
}
public class NewsPaper extends Subject {
	public void setContent(String content) {
		this.content = content;
		notifyObservers(content);
	}
}
//其实Java中已经有了观察者模式的部分实现了,如下
public class NewsPaper extends java.util.Observable {
	private String content;
	public String getContent() {
		return content;
	}
	public void setContent(String content) {
		this.content = content;
		//在使用Java中的Observer模式时,下面这句话不可少
		this.setChanged();
		//推模式
		this.notifyObservers(this.content);
		//拉模式
		//this.notifyObservers();
	}
}
//还可以在notify方法中对状态进行判断,从而通知不同的观察者
//观察者模式本质:触发联动
//看了这个模式,感觉是不是跟微博的信息机制有一定的联系
//当用户发送新微博时,把新信息推送给他的粉丝

时间: 2024-10-27 11:16:31

设计模式入门之观察者模式Observer的相关文章

我理解设计模式C++实现观察者模式Observer Pattern

概述: 近期中国股市起起伏伏,当然了起伏就用商机,小明发现商机后果断想入市,买入了中国证券,他想在电脑client上,网页上,手机上,iPad上都能够查看到该证券的实时行情,这样的情况下我们应该怎么设计我们的软件呢?我们能够这样:小明的全部client上都订阅中国证券这个股票,仅仅要股票一有变化,全部的client都会被通知到而且被自己主动更新. 这就是我们的观察者模式,她定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时, 全部依赖于它的对象都得到通知并被自己主动更新. 类图与实例:

设计模式 ( 十六 ) 观察者模式Observer(对象行为型)

1.概述 一些面向对象的编程方式,提供了一种构建对象间复杂网络互连的能力.当对象们连接在一起时,它们就可以相互提供服务和信息. 通常来说,当某个对象的状态发生改变时,你仍然需要对象之间能互相通信.但是出于各种原因,你也许并不愿意因为代码环境的改变而对代码做大的修改.也许,你只想根据你的具体应用环境而改进通信代码.或者,你只想简单的重新构造通信代码来避免类和类之间的相互依赖与相互从属. 2.问题 当一个对象的状态发生改变时,你如何通知其他对象?是否需要一个动态方案――一个就像允许脚本的执行一样,允

设计模式 - 观察者模式(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,行为型模式)(7)

1.观察者模式又叫做发布-订阅模式. 2.观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象.这个主题对象在状态发生变化时,会通知所有观察者对象,使它们能够自动更新自己. 3.使用观察者模式的好处:维护相关对象间的一致性.我们不希望为了维持一致性而使各类紧密耦合,这样会给维护.扩展和重用都带来不便.什么时候使用观察者模式:当一个对象的改变需要同时改变其他对象的时候,而且它不知道具体有多少对象有待改变时,应该考虑使用观察者模式. private static void M

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

Observer Pattern 是一种常用的设计模式,它是一种事件监听模型.该模式有两个角色,一个是Subject, 另一个是Observer.Subject 保存有多个Observer的引用,一旦特定的事件发生,Subject会通知它所有的Observer,Observer得到该通知后执行相关程序逻辑.其中,Observer只有先向Subject注册后才能被Subject知晓.这就像订报纸,只有我们向出版社提出订报的申请,出版社才会把我们列入订阅者名单,然后每当新报纸印好时,出版社会通知订阅

[Android&amp;amp;Java]浅谈设计模式-代码篇:观察者模式Observer

观察者,就如同一个人,对非常多东西都感兴趣,就好像音乐.电子产品.Game.股票等,这些东西的变化都能引起爱好者们的注意并时刻关注他们.在代码中.我们也有这种一种方式来设计一些好玩的思想来.今天就写个Demo来描写叙述一下这种思想,用java内置的Observer来实现这一思想. 好,程序猿是不善言语的,看代码先. 1.demo的结构: 2.先创建我们的主题类Subject,他就是我们本demo的明星类.继承了Observable,顾名思义,就是被观察的类 .其它观察者对他但是虎视眈眈哦(事实上

设计模式之观察者模式(Observer)摘录

23种GOF设计模式一般分为三大类:创建型模式.结构型模式.行为模式. 创建型模式抽象了实例化过程,它们帮助一个系统独立于如何创建.组合和表示它的那些对象.一个类创建型模式使用继承改变被实例化的类,而一个对象创建型模式将实例化委托给另一个对象.创建型模式有两个不断出现的主旋律.第一,它们都将关于该系统使用哪些具体的类的信息封装起来.第二,它们隐藏了这些类的实例是如何被创建和放在一起的.整个系统关于这些对象所知道的是由抽象类所定义的接口.因此,创建型模式在什么被创建,谁创建它,它是怎样被创建的,以

说说设计模式~观察者模式(Observer)

观察者模式,也叫发布/订阅模式(publish/subscribe),监视器模式等.在此种模式中,一个目标物件管理所有相依于它的观察者物件,并且在它本身的状态改变时主动发出通知.这通常透过呼叫各观察者所提供的方法来实现.. 何时能用到它? 此种模式通常被用来实现事件处理系统,例如,当一个数据仓储操作中,它的添加功能可能会有一个功能,当添加被触发时,所以订阅了这个添加事件需求的代码 块,都会被触发执行,在这个过程中,数据仓储的添加操作就是被观察者,而所以的订阅者就是它的观察者,发被观察者在某种情况