观察者模式是软件设计模式的一种。在此种模式中,一个目标对象管理所有相依于它的观察者对象,并且在它本身的状态改变时主动发出通知。这通常透过呼叫各观察者所提供的方法来实现。此种模式通常被用来实时事件处理系统。----WIKIPEDIA
个人理解
观察者模式,就是使得被观察者中持有观察者的对象实例,在发生某些事件的时候,通过notify“通知”观察者,完成相应的操作,他也叫作发布-订阅模式,定义对象间一对多的依赖关系,使得被观察者对象产生动作,即可通知其依赖的对象该被观察者发生了变更。
案例解析
正好前几天买了两只巴西龟,以这个为例子,乌龟也时会饿的,他饿了我就要去喂它吃的,这样的话,可以说正好用的到观察者模式。
推的方式
public interface Observable {
// 添加观察者
public void addObserver(Observer observer);
// 删除观察者
public void removeObserver(Observer observer);
// 通知观察者
public void notifyObservers(String info);
}
public interface Observer {
// 喂食
public void feed(String info);
}
public class Turtle implements Observable{
private List<Observer> observerList = new ArrayList<Observer>();
public void hungry(){
this.notifyObservers("我饿了!");
}
@Override
public void addObserver(Observer observer) {
observerList.add(observer);
}
@Override
public void removeObserver(Observer observer) {
if(observerList != null && observerList.contains(observer)){
observerList.remove(observer);
}
}
@Override
public void notifyObservers(String info) {
for (Observer observer : observerList) {
observer.feed(info);
}
}
}
public class XX implements Observer {
@Override
public void feed(String info) {
System.out.println("喂饲料!");
}
}
这里的情况是Turtle类明确知道它要通知观察者什么,那么这种方式可以看成是推的方式,但是并不一定都是一定知道对方想要什么,那么这个时候,需要一种拉 取得方式,也就是将自身的实例传递给观察者,交由观察者自己去决定获取什么也就是拉取什么。
拉的方式
主要的变更如下:
public class Turtle2 implements Observable2 {
private List<Observer2> observerList = new ArrayList<Observer2>();
public void hungry(){
this.notifyObservers();
}
@Override
public void addObserver(Observer2 observer) {
observerList.add(observer);
}
@Override
public void removeObserver(Observer2 observer) {
if(observerList != null && observerList.contains(observer)){
observerList.remove(observer);
}
}
@Override
public void notifyObservers() {
for (Observer2 observer : observerList) {
observer.feed(this);
}
}
@Override
public boolean isNeedFeed() {
return true;
}
}
观察者模式的优点
1. 观察者与被观察者之间是抽象耦合:扩展被观察者和观察者时较容易。
2. 建立一套触发机制,经过一系列的触发机制,形成触发链。
观察者模式的缺点
多级触发的时候,效率让人担忧,在设计的时候要充分的考虑这一点。
观察者模式的适用范围
1. 关联行为场景。
2. 事件的多级触发。
3. 跨系统的消息交换场景,消息队列的处理机制。
源代码下载
推荐阅读
"围观"设计模式(18)--行为型之模板方法模式(TemplateMethod Pattern)
"围观"设计模式(16)--结构型之组合模式(Composite Pattern)