您的位置:首页 > 其它

"围观"设计模式(19)--行为型之观察者模式(Observer Pattern)

2016-06-08 20:08 831 查看
观察者模式是软件设计模式的一种。在此种模式中,一个目标对象管理所有相依于它的观察者对象,并且在它本身的状态改变时主动发出通知。这通常透过呼叫各观察者所提供的方法来实现。此种模式通常被用来实时事件处理系统。----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)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: