目录
Observer 观察者模式
目录
[TOC]
1. 概述
1.1. Head First设计模式定义
观察者模式定义了对象之间的一对多依赖,这样一来,当一个对象状态改变时,它的所有依赖者都会收到通知并自动更新。
典型的问题比如报社,只要你是他们的订户,他们每次有新报纸出版时,就会向你这送来,当你不想要看报纸时,取消订阅,他们就不会再给你送报纸。
1.2. 自我理解
1、观察者模式是一种发布订阅模式,发布者发布消息,订阅者收取消息,订阅者没有订阅该发布者就收不到消息;
2、观察者模式有两种模式,一种推,一种拉。推是直接传递消息给订阅者,订阅者直接使用。拉是把消息放在发布接口中,订阅者自己去取;
3、JDK中自带了 java.util.Observer 和 java.util.Observable。
应用场景:
jsp常用的各种事件,onclick、onmouse、onselect、onchange 就是利用了观察者模式思想。包括java的swing
1.3. 观察者模式组成结构
抽象主题 (Subject):抽象主题角色把所有观察者对象保存在一个集合里,每个主题都可以有任意数量的观察者,抽象主题提供一个接口,可以增加和删除观察者对象。
具体主题 (ConcreteSubject):该角色将有关状态存入具体观察者对象,在具体主题的内部状态发生改变时,给所有注册过的观察者发送通知。
抽象观察者 (Observer):是观察者的抽象类,它定义了一个更新接口,使得在得到主题更改通知时更新自己。
具体观察者 (ConcrereObserver):实现抽象观察者定义的更新接口,以便在得到主题更改通知时更新自身的状态。
2. UML
3. Example
3.1. 自定义观察者模式
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 |
package com.loserzhao.jomin.designpattern.observer; import java.util.ArrayList; import java.util.List; public class ObserverPatternDemo { public static void main(String[] args) { Observer tomObserver = new TomObserver(); Observer jettyObserver = new JettyObserver(); NewspaperSubject newspaperSubject = new NewspaperSubject(); newspaperSubject.registerObserver(tomObserver); newspaperSubject.registerObserver(jettyObserver); newspaperSubject.sendNewspaper("today SiYuanZhao is full six month"); newspaperSubject.removeObserver(tomObserver); newspaperSubject.sendNewspaper("today China copy TaiWan...."); } public static interface Observer{ void update(String newspaper); } public static interface Subject{ void registerObserver(Observer observer); void removeObserver(Observer observer); void notifyObserver(); } public static class NewspaperSubject implements Subject{ List<Observer> observers = new ArrayList<Observer>(); String newspaper; public void registerObserver(Observer observer) { if(null != observer){ observers.add(observer); } } public void removeObserver(Observer observer) { if(null != observer){ int index = observers.indexOf(observer); observers.remove(index); } } public void notifyObserver() { for (Observer observer : observers){ observer.update(newspaper); } } public void sendNewspaper(String newspaper){ this.newspaper = newspaper; notifyObserver(); } } public static class TomObserver implements Observer{ public void update(String newspaper) { System.out.println("tom copy newspaper=>{"+newspaper+"}"); } } public static class JettyObserver implements Observer{ public void update(String newspaper) { System.out.println("jetty copy newspaper=>{"+newspaper+"}"); } } } |
3.2. JDK自带的观察者模式
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 |
package com.loserzhao.jomin.designpattern.observer; import java.util.Observable; import java.util.Observer; public class JdkObserverPatternDemo { public static void main(String[] args) { Observer tomObserver = new TomObserver(); Observer jettyObserver = new JettyObserver(); NewpaperObserverable observable = new NewpaperObserverable(); observable.addObserver(tomObserver); observable.addObserver(jettyObserver); observable.sendNewspaper("news1"); observable.deleteObserver(tomObserver); observable.sendNewspaper("news2"); } public static class NewpaperObserverable extends Observable{ private String newspaper; public String getNewspaper(){ return newspaper; } public void sendNewspaper(String newspaper){ this.newspaper = newspaper; this.setChanged(); // 拉模式 // this.notifyObservers(); // 推模式 this.notifyObservers(newspaper); } } public static class TomObserver implements Observer{ public void update(Observable o, Object arg) { // 拉模式 String newspaper=((NewpaperObserverable)o).getNewspaper(); // 推模式 // String newspaper=arg.toString(); System.out.println("tom copy msg=>{"+newspaper+"}"); } } public static class JettyObserver implements Observer{ public void update(Observable o, Object arg) { // 拉模式 // String newspaper=((NewpaperObserverable)o).getNewspaper(); // 推模式 String newspaper=arg.toString(); System.out.println("jetty copy msg=>{"+newspaper+"}"); } } } |
原创文章,转载请注明: 转载自LoserZhao – 诗和远方[ http://www.loserzhao.com/ ]
本文链接地址: http://www.loserzhao.com/java/designpattern/observer-designpattern.html
文章的脚注信息由WordPress的wp-posturl插件自动生成
0 条评论。