观察者模式
2016-05-09 00:35
169 查看
什么是观察者模式呢?
就是主题对象和依赖对象的一对多的关系,当主题变化时,依赖对象都能收到通知。也有人说是生产者和消费者关系,不管怎么说理解了就行。
场景:很多用户都订阅一篇新闻,当这篇新闻有变化时,订阅的用户都能收到通知
实现:
抽象一个观察者,它可以根据订阅的主题和状态值进行后续操作
定义读者1
定义读者2
抽象一个主题
定义一个新闻,读者1、2可以对其订阅
读者1、2订阅了一条新闻,当新闻变动了,比如有新评论了,读者1,2都能收到通知
就是主题对象和依赖对象的一对多的关系,当主题变化时,依赖对象都能收到通知。也有人说是生产者和消费者关系,不管怎么说理解了就行。
场景:很多用户都订阅一篇新闻,当这篇新闻有变化时,订阅的用户都能收到通知
实现:
抽象一个观察者,它可以根据订阅的主题和状态值进行后续操作
interface Observer { void update(Subject subject, int val); }
定义读者1
class ObserverOne implements Observer { @Override public void update(Subject subject, int val) { System.out.println(String.format("观察者1收到主题[%s]的值改变为[%d]", subject.toString(), val)); } }
定义读者2
class ObserverTwo implements Observer { @Override public void update(Subject subject, int val) { System.out.println(String.format("观察者2收到主题[%s]的值改变为[%d]", subject.toString(), val)); } }
抽象一个主题
abstract class Subject { private List<Observer> observers = new ArrayList<Observer>(); void register(Observer observer) { this.observers.add(observer); } void remove(Observer observer) { this.observers.remove(observer); } void notify(int val) { for(Observer o : observers) { o.update(this, val); } }; }
定义一个新闻,读者1、2可以对其订阅
class NewsSubject extends Subject { String name; int val; NewsSubject(String name, int val) { this.name = name; this.val = val; } void change(int val) { int rawVal = this.val; this.val = val; System.out.println(String.format("[%s]的状态由[%d]变为[%d]",name, rawVal, val)); notify(val); } @Override public String toString() { return name; } }
读者1、2订阅了一条新闻,当新闻变动了,比如有新评论了,读者1,2都能收到通知
public class ObserverDemo { public static void main(String[] args) { Observer observerOne = new ObserverOne(); Observer observerTwo = new ObserverTwo(); NewsSubject subject = new NewsSubject("新闻", 1); subject.register(observerOne); subject.register(observerTwo); subject.change(10); subject.change(20); } }
[code][/code]
相关文章推荐
- Spring的Controller请求方法中参数名匹配,但是参数类型不同会报404
- 第四章:管道与FIFO
- 雪碧图实现原理及应用
- 浅入树与二叉树
- OpenCV 之 图像平滑
- 浅入树与二叉树
- OpenCV 之 图像平滑
- wireshark使用心得 centos7安装wireshark: yum install wireshark wireshark-gnome
- wireshark使用心得 centos7安装wireshark: yum install wireshark wireshark-gnome
- DuiLib学习笔记(二) 扩展CScrollbar属性
- (变长数组)变量也可做特殊数组的长度
- Spark学习七:spark streaming与flume集成
- Spark学习八:spark streaming与flume和kafka集成
- (变长数组)变量也可做特殊数组的长度
- JAVA——泛型
- 重新学javaweb---过滤器 应用--全站乱码
- 【CS231n Winter 2016 Lecture 1 (Brief history&course overview)】
- Spark学习六:spark streaming
- windows 10激活出现0xc004f074错误
- Spark学习五:spark sql