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 {
@Override
public void onStartMigrateTask(MigrateEvent event) {
}
@Override
public void onPrepMigrateRecord(MigrateEvent event) {
}
@Override
public void onPostMigrateRecord(MigrateEvent event) {
}
@Override
public void onFailMigrateRecord(MigrateEvent event) {
}
@Override
public 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 {
@Override
public void onStartMigrateTask(MigrateEvent event) {
System.out.println("onStartMigrate -> start migrate task");
}
@Override
public 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 {
@Override
public void onPrepMigrateRecord(MigrateEvent event) {
System.out.println("onPrepMigrateRecord -> migrate row:" + event.getCurrentRow() + " to mysql");
}
@Override
public 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 {
@Override
public void onStartMigrateTask(MigrateEvent event) {
System.out.println("onStartMigrate -> start migrate email notification");
}
@Override
public 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 {
@Override
public 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 {
@Override
public void onStartMigrateTask(MigrateEvent event) {
System.out.println("onStartMigrate -> log start migrate task");
}
@Override
public void onPrepMigrateRecord(MigrateEvent event) {
System.out.println("onPrepMigrateRow -> log prep migrate record:" + event.getCurrentRow());
}
@Override
public void onPostMigrateRecord(MigrateEvent event) {
System.out.println("onPostMigrateRow -> log post migrate record:" + event.getCurrentRow());
}
@Override
public void onFailMigrateRecord(MigrateEvent event) {
System.out.println("onFailMigrateRow -> log fail migrate record:" + event.getCurrentRow());
}
@Override
public 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;
}
}