定义
定义对象间一种一对多的依赖关系,使得当每一个对象改变状态,则所有依赖于它的对象都会得到通知并自动更新
角色
目标角色(Subject):提供添加和删除观察者对象的接口,可以有一个或多个观察者
具体目标角色:具体目标角色的状态发生变化时,通知它的观察者
观察者角色(Observer):为具体观察者提供一个统一接口
具体观察者角色:在目标发生改变时获得通知,并做出相应处理
优点
- 观察者和目标的关联关系不紧密,耦合度低,容易扩展
- 目标变化时,可向所有观察者发出通知,可用于广播通讯
缺点
- 如果观察者较多,通知观察者花费的时间较长
- 观察者模式用的是触发链的结构,比较容易出现循环引用的错误
应用场景
- AWT中的事件处理机制
类图
package com.vapy.behavior.Observe;
import java.util.Vector;
/**
*
* @author vapy
*
*/
public abstract class Subject {
private Vector<Observer> obs = new Vector<Observer>();
public void addObserver(Observer observer) {
this.obs.add(observer);
}
public void delObserver(Observer observer) {
this.obs.remove(observer);
}
protected void notifyObservers() {
for(Observer o : obs) {
o.update();
}
}
public abstract void click();
}
package com.vapy.behavior.Observe;
/**
*
* @author vapy
*
*/
public class Mouse extends Subject {
@Override
public void click() {
System.out.println("i am a mouse, click");
this.notifyObservers();
}
}
package com.vapy.behavior.Observe;
/**
*
* @author vapy
*
*/
public interface Observer {
public void update();
}
package com.vapy.behavior.Observe;
/**
*
* @author vapy
*
*/
public class MouseListener1 implements Observer {
@Override
public void update() {
System.out.println("i am a mouse listener 1, i receive the mouse click");
}
}
package com.vapy.behavior.Observe;
/**
*
* @author vapy
*
*/
public class MouseListener2 implements Observer {
@Override
public void update() {
System.out.println("i am a mouse listener 2, i receive the mouse click");
}
}
package com.vapy.behavior.Observe;
/**
*
* @author vapy
*
* 观察者模式
*
*/
public class Client {
public static void main(String[] args) {
Subject sub = new Mouse();
sub.addObserver(new MouseListener1());
sub.addObserver(new MouseListener2());
sub.click();
}
}
本文代码可在github查看:点击此处