您的位置:首页 > 其它

设计模式之观察者(Observer)模式

2016-04-13 12:48 483 查看
别名
发布-订阅(Publish-Subscribe)模式、从属者(Dependents)模式

定义
Define a one-to-many dependency between objects so that when one object changes state, all its dependents are notified and updated automatically.
定义一组对象间的一对多依赖,使得当一个对象的状态改变时,它的所有依赖能得到通知并自动更新。

结构



组成
主题
知道它的观察者
允许任意多个观察者观察这个主题
提供附加和分离观察者的接口
观察者
定义一个当主题发生变化时被通知的更新接口
具体主题
保存对此主题感兴趣的观察者的状态
当自身状态改变时通知观察者
具体观察者
保持对主题的引用
保存应当和主题保持一致的状态
实现观察者的更新接口使自己的状态能和主题保持一致

代码

主题
package prj.designpatterns.observer.prototype;

/**
* 主题
*
* @author LuoXin
*
*/
public interface ISubject {
public void addObserver(IObserver o);

public void deleteObserver(IObserver o);

public void notifyObserver();
}
观察者
package prj.designpatterns.observer.prototype;

/**
* 观察者
*
* @author LuoXin
*
*/
public interface IObserver {
public void update();
}
具体主题
package prj.designpatterns.observer.prototype;

import java.util.ArrayList;
import java.util.List;

/**
* 具体主题
*
* @author LuoXin
*
*/
public class ConcreteSubject implements ISubject {
private List<IObserver> observers;

public ConcreteSubject() {
this.observers = new ArrayList<IObserver>();
}

@Override
public void addObserver(IObserver o) {
observers.add(o);
System.out.println("添加了观察者" + o.hashCode());
}

@Override
public void deleteObserver(IObserver o) {
observers.remove(o);
System.out.println("删除了观察者" + o.hashCode());
}

@Override
public void notifyObserver() {
for (IObserver o : observers) {
o.update();
System.out.println("通知了观察者" + o.hashCode());
}
}

}
具体观察者
package prj.designpatterns.observer.prototype;

/**
* 具体观察者
*
* @author LuoXin
*
*/
public class ConcreteObserver implements IObserver {

@Override
public void update() {
System.out.println("观察者" + this.hashCode() + "收到了通知");
}

}
客户端
package prj.designpatterns.observer.prototype;

/**
* 客户端
*
* @author LuoXin
*
*/
public class Client {
public static void main(String[] args) {
ISubject subject = new ConcreteSubject();
IObserver observer1 = new ConcreteObserver();
IObserver observer2 = new ConcreteObserver();

subject.addObserver(observer1);
subject.addObserver(observer2);
subject.notifyObserver();

subject.deleteObserver(observer2);
subject.notifyObserver();

}
}


仓库
https://github.com/luoxin1992/DesignPatterns/tree/master/src/prj/designpatterns/observer


后记
JDK通过java.util.Observer和java.util.Observable内置了对观察者模式的支持
该模式既支持Observable向Observer推(Push)数据,也支持Observer从Observable拉(Pull)数据
但注意Observable是逆序通知Observer,而且Observable是一个类!【好像是第一次见-able结尾的类……】
另,观察者模式和回调机制十分相似,可以把回调机制看作观察者模式的特例(只有一个观察者)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息