设计模式入门之观察者模式Observer
2014-04-29 18:25
369 查看
//观察者模式定义:定义对象间的一种一对多的依赖关系 //当一个对象的状态发生改变时,所有依赖它的对象都得到通知并被自动更新 //实例:用户订阅报纸,当报社出版新报纸时,通知所有的订阅者 //直接上代码,为了理解过程,先上原始代码 //目标对象 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方法中对状态进行判断,从而通知不同的观察者 //观察者模式本质:触发联动 //看了这个模式,感觉是不是跟微博的信息机制有一定的联系 //当用户发送新微博时,把新信息推送给他的粉丝
相关文章推荐
- PropertyChangeListener简单理解
- 什么是设计模式
- 设计模式之创建型模式 - 特别的变量问题
- 设计模式之创建型模式
- 介绍php设计模式中的工厂模式
- 面向对象设计模式的核心法则
- 常见的PHP五种设计模式小结
- 小议javascript 设计模式 推荐
- javascript 设计模式之单体模式 面向对象学习基础
- 最常用的12种设计模式小结
- php设计模式 Command(命令模式)
- php设计模式介绍之值对象模式第1/5页
- 设计模式之构建(Builder)模式 建造房子实例分析
- Javascript 设计模式(二) 闭包
- Android源码学习之观察者模式应用及优点介绍
- php设计模式之观察者模式的应用详解
- javascript学习笔记(九) js对象 设计模式
- Python设计模式之代理模式实例
- Python设计模式之观察者模式实例