1. 定义
定义对象间的一对多的关系,当一个对象的状态改变时,所有依赖它的对象都得到通知并自动更新。
2. 类图
3. 实例
package com.jerry.designpattern; /** * * @author Jerry * @date 2015年1月21日 下午3:40:21 */ public interface Observer { void update(String content); } package com.jerry.designpattern; /** * * @author Jerry * @date 2015年1月21日 下午3:47:57 */ public class Reader implements Observer{ private String name; public Reader(String name) { this.name = name; } @Override public void update(String content) { // TODO Auto-generated method stub System.out.println("读者" + this.name + "拿到了今天的报纸,今天报纸内容是:" + content); } } package com.jerry.designpattern; import java.util.ArrayList; import java.util.Iterator; import java.util.List; /** * * @author Jerry * @date 2015年1月21日 下午3:39:36 */ public class Subject { private List<Observer> observers = new ArrayList<Observer>(); protected void addObserver(Observer observer) { observers.add(observer); } protected void removeObserver(Observer observer) { observers.remove(observer); } protected void notifyObservers(String content) { Iterator<Observer> iterator = observers.iterator(); while (iterator.hasNext()) { Observer observer = iterator.next(); observer.update(content); } } } package com.jerry.designpattern; /** * * @author Jerry * @date 2015年1月21日 下午3:50:45 */ public class Newspaper extends Subject{ private String content; public void setContent(String content) { this.content = content; super.notifyObservers(this.content); } } package com.jerry.designpattern; /** * * @author Jerry * @date 2015年1月21日 下午3:51:49 */ public class Client { public static void main(String[] args) { Newspaper newspaper = new Newspaper(); /* * 创建若干读者 */ Reader reader1 = new Reader("唐三藏"); Reader reader2 = new Reader("孙悟空"); Reader reader3 = new Reader("猪悟能"); Reader reader4 = new Reader("沙悟净"); newspaper.addObserver(reader1); newspaper.addObserver(reader2); newspaper.addObserver(reader3); newspaper.addObserver(reader4); newspaper.setContent("唐僧师徒四人大闹女儿国"); } }
4. 优缺点
观察者模式的优点
a. 观察者实现了观察者和目标之间的抽象耦合
b. 观察者实现了动态联动
c. 观察者支持广播通信
观察者模式的缺点
由于观察者模式每次都是广播通信,不管观察者需不需要,每个观察者都会被调用update方法,如果观察者不需要执行相应处理,那么这次操作就浪费了。