Observer概述
UML概述

玩具代码案例1 - 模式监听一个数据迁移过程中的事件
事件的管理器
package online.javabook.gof.behavioral.patterns6.observer.migrate.provider;import online.javabook.gof.behavioral.patterns6.observer.migrate.event.MigrateEvent;import online.javabook.gof.behavioral.patterns6.observer.migrate.listener.api.IMigrateListener;import online.javabook.gof.behavioral.patterns9.template1.migrate.template.IConnector;import java.util.ArrayList;import java.util.List;public class MigrateListenerProvider {private List<IMigrateListener> listeners = new ArrayList<>();public void addListener(IMigrateListener listener) {listeners.add(listener);}public void removeListener(IMigrateListener listener) {listeners.remove(listener);}public void onStartMigrate(IConnector sourceConnector, IConnector targetConnector) {for (IMigrateListener listener : listeners){try {listener.onStartMigrateTask(new MigrateEvent(sourceConnector, targetConnector));}catch (Exception e){System.out.println(e);}}}public void onPrepMigrateRow(IConnector sourceConnector, IConnector targetConnector, String row) {for (IMigrateListener listener : listeners){try {listener.onPrepMigrateRecord(new MigrateEvent(sourceConnector, targetConnector, row));}catch (Exception e){System.out.println(e);}}}public void onPostMigrateRow(IConnector sourceConnector, IConnector targetConnector, String row) {for (IMigrateListener listener : listeners){try {listener.onPostMigrateRecord(new MigrateEvent(sourceConnector, targetConnector, row));}catch (Exception e){System.out.println(e);}}}public void onFailMigrateRow(IConnector sourceConnector, IConnector targetConnector, String row, Exception exception) {for (IMigrateListener listener : listeners){try {listener.onFailMigrateRecord(new MigrateEvent(sourceConnector, targetConnector, row, exception));}catch (Exception e){System.out.println(e);}}}public void onFinishMigrate(IConnector sourceConnector, IConnector targetConnector) {for (IMigrateListener listener : listeners){try {listener.onFinishMigrateTask(new MigrateEvent(sourceConnector, targetConnector));}catch (Exception e){System.out.println(e);}}}}
事件的观察者
观察数据迁移任务过程中的每一个时间点发生的事件,这样很好的将额外的业务逻辑从主线逻辑中分离了
package online.javabook.gof.behavioral.patterns6.observer.migrate.listener.api;import online.javabook.gof.behavioral.patterns6.observer.migrate.event.MigrateEvent;public interface IMigrateListener {void onStartMigrateTask(MigrateEvent event);void onPrepMigrateRecord(MigrateEvent event);void onPostMigrateRecord(MigrateEvent event);void onFailMigrateRecord(MigrateEvent event);void onFinishMigrateTask(MigrateEvent event);}
默认的适配器
在一个观察者模式中往往会配合默认适配器模式的使用
package online.javabook.gof.behavioral.patterns6.observer.migrate.listener.api;import online.javabook.gof.behavioral.patterns6.observer.migrate.event.MigrateEvent;public class DefaultMigrateAdapterListener implements IMigrateListener {@Overridepublic void onStartMigrateTask(MigrateEvent event) {}@Overridepublic void onPrepMigrateRecord(MigrateEvent event) {}@Overridepublic void onPostMigrateRecord(MigrateEvent event) {}@Overridepublic void onFailMigrateRecord(MigrateEvent event) {}@Overridepublic void onFinishMigrateTask(MigrateEvent event) {}}
观察者的实现
MigrateTaskListener
数据迁移任务的开始与结束时的监听器
package online.javabook.gof.behavioral.patterns6.observer.migrate.listener.impl;import online.javabook.gof.behavioral.patterns6.observer.migrate.event.MigrateEvent;import online.javabook.gof.behavioral.patterns6.observer.migrate.listener.api.DefaultMigrateAdapterListener;public class MigrateTaskListener extends DefaultMigrateAdapterListener {@Overridepublic void onStartMigrateTask(MigrateEvent event) {System.out.println("onStartMigrate -> start migrate task");}@Overridepublic void onFinishMigrateTask(MigrateEvent event) {System.out.println("onFinishMigrate -> finish migrate task");}}
MigrateRecordListener
数据迁移单条记录时候的监听器
package online.javabook.gof.behavioral.patterns6.observer.migrate.listener.impl;import online.javabook.gof.behavioral.patterns6.observer.migrate.event.MigrateEvent;import online.javabook.gof.behavioral.patterns6.observer.migrate.listener.api.DefaultMigrateAdapterListener;public class MigrateRecordListener extends DefaultMigrateAdapterListener {@Overridepublic void onPrepMigrateRecord(MigrateEvent event) {System.out.println("onPrepMigrateRecord -> migrate row:" + event.getCurrentRow() + " to mysql");}@Overridepublic void onPostMigrateRecord(MigrateEvent event) {System.out.println("onPostMigrateRow -> migrate row:" + event.getCurrentRow() + " to mysql");}}
MigrateMessageListener
数据迁移任务在开始与结束时的消息通知监听器
package online.javabook.gof.behavioral.patterns6.observer.migrate.listener.impl;import online.javabook.gof.behavioral.patterns6.observer.migrate.event.MigrateEvent;import online.javabook.gof.behavioral.patterns6.observer.migrate.listener.api.DefaultMigrateAdapterListener;public class MigrateMessageListener extends DefaultMigrateAdapterListener {@Overridepublic void onStartMigrateTask(MigrateEvent event) {System.out.println("onStartMigrate -> start migrate email notification");}@Overridepublic void onFinishMigrateTask(MigrateEvent event) {System.out.println("onFinishMigrate -> finish migrate email notification");}}
MigrateExceptionListener
数据迁移记录时候的异常处理
package online.javabook.gof.behavioral.patterns6.observer.migrate.listener.impl;import online.javabook.gof.behavioral.patterns6.observer.migrate.event.MigrateEvent;import online.javabook.gof.behavioral.patterns6.observer.migrate.listener.api.DefaultMigrateAdapterListener;public class MigrateExceptionListener extends DefaultMigrateAdapterListener {@Overridepublic void onFailMigrateRecord(MigrateEvent event) {System.out.println("onFailMigrateRecord -> migrate row:" + event.getCurrentRow() + " to mysql fail:" + event.getException());}}
MigrateLoggerListener
数据迁移中在合适的事件点添加日志
package online.javabook.gof.behavioral.patterns6.observer.migrate.listener.impl;import online.javabook.gof.behavioral.patterns6.observer.migrate.event.MigrateEvent;import online.javabook.gof.behavioral.patterns6.observer.migrate.listener.api.DefaultMigrateAdapterListener;public class MigrateLoggerListener extends DefaultMigrateAdapterListener {@Overridepublic void onStartMigrateTask(MigrateEvent event) {System.out.println("onStartMigrate -> log start migrate task");}@Overridepublic void onPrepMigrateRecord(MigrateEvent event) {System.out.println("onPrepMigrateRow -> log prep migrate record:" + event.getCurrentRow());}@Overridepublic void onPostMigrateRecord(MigrateEvent event) {System.out.println("onPostMigrateRow -> log post migrate record:" + event.getCurrentRow());}@Overridepublic void onFailMigrateRecord(MigrateEvent event) {System.out.println("onFailMigrateRow -> log fail migrate record:" + event.getCurrentRow());}@Overridepublic void onFinishMigrateTask(MigrateEvent event) {System.out.println("onFinishMigrate -> log finish migrate task");}}
事件对象
MigrateEvent
事件中往往封装了程序运行时的上下文信息
package online.javabook.gof.behavioral.patterns6.observer.migrate.event;import online.javabook.gof.behavioral.patterns9.template1.migrate.template.IConnector;public class MigrateEvent {private IConnector sourceConnector;private IConnector targetConnector;private String currentRow;private Exception exception;public MigrateEvent(IConnector sourceConnector, IConnector targetConnector) {this.sourceConnector = sourceConnector;this.targetConnector = targetConnector;}public MigrateEvent(IConnector sourceConnector, IConnector targetConnector, String currentRow) {this.sourceConnector = sourceConnector;this.targetConnector = targetConnector;this.currentRow = currentRow;}public MigrateEvent(IConnector sourceConnector, IConnector targetConnector, String currentRow, Exception exception) {this.sourceConnector = sourceConnector;this.targetConnector = targetConnector;this.currentRow = currentRow;this.exception = exception;}public IConnector getSourceConnector() {return sourceConnector;}public IConnector getTargetConnector() {return targetConnector;}public String getCurrentRow() {return currentRow;}public Exception getException() {return exception;}}

