1 什么是观察者模式
观察者模式:定义了对象之间的一对多依赖,这样一来,当一个对象改变状态时,它的所有依赖着都会收到通知并且自动更新。
2 一个例子
比如说定报纸
- 报社的业务就是出版报纸。
- 向某家报社订报纸,只要你是他们的订户,你就一直会收到新的报纸。
- 当你不想看报纸了,你就取消订阅。
- 只要报社没有倒闭,就会源源不断的有人订阅报纸或者取消订阅。
3 构成
观察者模式有两大组成,一个是:主题,也就是我们的报社,另外一个就是观察者,也就是我们的用户。如图:
3 例子
主题接口
public interface ISubject {
public void registObserver(IObserver o);
public void removeObserver(IObserver o);
/**
* 当主题改变时便会通知所有观察者
*/
public void notifyObservers();
}
观察者接口
public interface IObserver {
/**
* 当出新报纸了,主题便会调用这个方法,把新报纸内容传递过来。
* @param content
*/
public void update(String content);
}
报纸类
public class NewsPaper implements ISubject {
private ArrayList<IObserver> obs;
private String content;
@Override
public void registObserver(IObserver o) {
obs.add(o);
}
@Override
public void removeObserver(IObserver o) {
obs.remove(o);
}
@Override
public void notifyObservers() {
for (IObserver ob : obs) {
ob.update(content);
}
}
public NewsPaper() {
obs = new ArrayList<IObserver>();
}
/**
* 出新报纸调用这个方法
* @param content
*/
public void publish(String content){
this.content = "新报纸出版了,内容是:"+content;
notifyObservers();
}
}
公司类(公司也可以订报纸)
public class Company implements IObserver {
@Override
public void update(String content) {
System.out.println("公司收到了新报纸,"+content);
}
}
个人类
public class Person implements IObserver {
@Override
public void update(String content) {
System.out.println("个人收到了新报纸,"+content);
}
}
测试类
public class MyTest {
public static void main(String[] args) {
NewsPaper newspaper = new NewsPaper();
Person person = new Person();
Company company = new Company();
// 订报纸
newspaper.registObserver(person);
newspaper.registObserver(company);
//发行报纸
newspaper.publish("周三的新报纸");
}
}