《研磨设计模式》chap12 观察者模式observer(2)模式介绍

1. 两个步骤

. 注册
《研磨设计模式》chap12 观察者模式observer(2)模式介绍
. 通知
《研磨设计模式》chap12 观察者模式observer(2)模式介绍

2. 推模型和拉模型

  • 推模型
    目标对象主动向观察者推送目标的详细信息,不管观察者是否需要,推送的信息通常是目标对象的全部或部分数据,相当于是在广播通信。
  • 拉模型
    目标对象在通知观察者的时候,只传递少量信息。如果观察者需要更具体的信息,由观察者主动到目标对象中获取,相当于是观察者从目标对象中拉数据。一般这种模型的实现中,会把目标对象自身通过update方法传递给观察者,这样在观察者需要获取数据的时候,就可以通过这个引用来获取了。

推模型是假定目标对象知道观察者需要的数据;而拉模型是目标对象不知道观察者具体需要什么数据,没有办法的情况下,干脆把自身传给观察者,让观察者自己去按需取值。
推模型可能会使得观察者对象难以复用,因为观察者定义的update方法是按需而定义的,可能无法兼顾没有考虑到的使用情况。这就意味着出现新情况的时候,就可能需要提供新的update方法,或者是干脆重新实现观察者。
而拉模型就不会造成这样的情况,因为拉模型下,update方法的参数是目标对象本身,这基本上是目标对象能传递的最大数据集合了,基本上可以适应各种情况的需要。

2.1推模型

public class NewsPaper extends Subject{
	public void setContent(String content) {
		this.content = content; 
		notifyObservers(content);
	}
}

public interface Observer {
	//被通知的方法,直接把报纸的内容推送过来 
	public void update(String content);
}

public class Reader implements Observer{ 
	public void update(String content) { 
	}

public class Subject { 
	protected void notifyObservers(String content) {
		for(Observer reader : readers){
			reader.update(content);
		}
	}
}
上一篇:《研磨设计模式》chap12 观察者模式observer(1)模式简介


下一篇:设计模式-观察者模式