Head First: 观察者模式

来源:互联网 发布:诺基亚n9刷机软件 编辑:程序博客网 时间:2024/06/06 12:32

1. 出版者+订阅者=观察者模式

    如果你了解报纸的订阅是怎么回事,其实就知道观察者模式是怎么回事,只是名称不太一样:出版社称为“主题(Subject)”,订阅者称为“观察者(Observer)”。

2. 定义观察者模式

     观察者模式定义了对象之间的一对多依赖,这样一来,当一个对象改变状态时,它的所有依赖都会收到通知并自动更新。

3. 观察者模式的类图

    

4. Java实现观察者模式

/** * 观察者统一需要实现的接口 */public interface Observer {public void update(String info);}/** * 主题需要实现的接口 */public interface Subject {/** * 注册观察者 */public void registerObserver(Observer o);/** * 删除(取消)观察者 */public void removeObserver(Observer o);/** * 通知观察者接受数据 */public void notifyObservers();}/** * 实现了主题接口的数据源 * @author zhangshaoliang * */public class DataSource implements Subject {/** 观察者列表 */private ArrayList observers;/** 数据信息 */private String info;public DataSource() {observers = new ArrayList();}@Overridepublic void registerObserver(Observer o) {observers.add(o);}@Overridepublic void removeObserver(Observer o) {int pos = observers.indexOf(o);if (pos >= 0) {observers.remove(pos);}}@Overridepublic void notifyObservers() {for (Object o : observers) {((Observer)o).update(info);}}private void onDataUpdated() {notifyObservers();}/** * 数据源更新数据 */public void setData(String newInfo) {this.info = newInfo;onDataUpdated();}}/** * 具体的一个观察者 * */public class DataReader implements Observer {private String mInfo;private Subject mDataSource;public DataReader(Subject dataSource) {mDataSource = dataSource;mDataSource.registerObserver(this);}public void display() {System.out.println("info:" + mInfo);}@Overridepublic void update(String info) {mInfo = info;display();}}/** * 测试类 */public class ObserverTester {/** * 测试方法 */public void test() {DataSource dataSource = new DataSource();DataReader dataReader = new DataReader(dataSource);dataSource.setData("News->Survivor: We hid behind ice");dataSource.setData("News->Boy stumbles upon ancient tooth");dataSource.setData("News->The 2014 Pritzker Prize");}}


0 0
原创粉丝点击