//观察者模式定义:定义对戏那个间的一种一对多的依赖关系 //当一个对象的状态发生改变时,所有依赖它的对象都得到通知并被自动更新 //实例:用户订阅报纸,当报社出版新报纸时,通知所有的订阅者 //直接上代码,为了理解过程,先上原始代码 //目标对象 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方法中对状态进行判断,从而通知不同的观察者 //观察者模式本质:触发联动 //看了这个模式,感觉是不是跟微博的信息机制有一定的联系 //当用户发送新微博时,把新信息推送给他的粉丝
原文地址:http://blog.csdn.net/herewjxiang/article/details/24733507