观察者模式
意图:定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。
解决:一个对象状态改变给其他对象通知的问题,而且要考虑到易用和低耦合,保证高度的协作。
使用:一个对象(目标对象)的状态发生改变,所有的依赖对象(观察者对象)都将得到通知,进行广播通知。
关键:在抽象类里有一个 ArrayList 存放观察者们。
优点: 1、观察者和被观察者是抽象耦合的。
2、建立一套触发机制。
缺点: 1、如果一个被观察者对象有很多的直接和间接的观察者的话,将所有的观察者都通知到会花费很多时间。
2、如果在观察者和观察目标之间有循环依赖的话,观察目标会触发它们之间进行循环调用,可能导致系统崩溃。
3、观察者模式没有相应的机制让观察者知道所观察的目标对象是怎么发生变化的,而仅仅只是知道观察目标发生了变化。
代码示例:
1、定义观察者抽象类
/** * 观察者模式 * @author [email protected] * */ public abstract class Observer { public abstract void update(String msg); }
2、定义多个观察者
public class Observer1 extends Observer{ @Override public void update(String msg) { // TODO Auto-generated method stub System.out.println(Observer1.class+":"+msg); } }
public class Observer2 extends Observer{ @Override public void update(String msg) { // TODO Auto-generated method stub System.out.println(Observer2.class+":"+msg); } }
public class Observer3 extends Observer{ @Override public void update(String msg) { // TODO Auto-generated method stub System.out.println(Observer3.class+":"+msg); } }
3、定义被观察者
import java.util.ArrayList; import java.util.List; /** * 观察者模式-被观察者 * @author [email protected] * */ public class Subject { private List<Observer> obs=new ArrayList<Observer>(); public void add(Observer ob){ obs.add(ob); } public void setMsg(String msg){ for(Observer ob:obs){ ob.update(msg); } } public static void main(String[] args) { Observer1 o1=new Observer1(); Observer2 o2=new Observer2(); Observer3 o3=new Observer3(); Subject s=new Subject(); s.add(o1); s.add(o2); s.add(o3); s.setMsg("信息"); s.setMsg("改变"); } }