角色描述
1、抽象主题(Subject):
它把所有观察者对象的引用保存到一个聚集里,每个主题都可以有任何数量的观察者。抽象主题提供一个接口,可以增加和删除观察者对象。
2、具体主题(Concrete Subject):
将有关状态存入具体观察者对象;在具体主题内部状态改变时,给所有登记过的观察者发出通知。
3、抽象观察者(Observer):
为所有的具体观察者定义一个接口,在得到主题通知时更新自己。
4、具体观察者(Concrete Observer):
实现抽象观察者角色所要求的更新接口,以便使本身的状态与主题状态协调。 [3]
---------------------------------------------------------------------------------------------------------------
观察者模式是一对多的关系,被观察者(主题)发生变化时通知所有观察者,使得观察者的状态更新和被观察者一致。被观察者和观察者都依赖于抽象,使得两者解耦。
在JDK的java.util包中,提供了Observable类以及Observer接口,它们构成了JDK对观察者模式的支持。
使用时,主题(被观察者)只需要实现Observable,观察者实现Observer来使用观察者模式。
以数据模型为例,当增加修改,删除数据模型时,需要同时处理基础表,字段表,索引约束表等信息,以数据模型为主题(被观察者),字段,表信息 ,索引约束等为观察者,当数据模型被增加修改删除时,其他的几个观察者需要作出相应的变更操作,保证与被观察者状态一致。
被观察者(主题)
package com.example.demo.gczModel;
import java.util.Observable;
public class MetaDataObservable extends Observable {
public void setDate(String operType,String arg1,String arg2){
this.setChanged();
this.notifyObservers(new String[]{operType,arg1,arg2});
}
}
观察者
package com.example.demo.gczModel;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.util.Observable;
import java.util.Observer;
public class MetaDataObserver implements Observer {
private static Logger logger=LoggerFactory.getLogger(MetaDataObserver.class);
@Override
public void update(Observable o, Object arg) {
if(arg instanceof String[]){
String[] targtArgs = (String[]) arg;
String operType = targtArgs[0];
String arg1 = targtArgs[1];
String arg2 = targtArgs[2];
//TODO 根据具体参数处理
if("update".equals(operType)){
updateMethod(arg1,arg2);
}
else if("del".equals(operType)){
delMethod(arg1,arg2);
}else if("add".equals(operType)){
addMethod(arg1,arg2);
}else{
logger.info("无效的相应操作:【{}】",operType);
}
}
}
void addMethod(String arg1, String arg2) {
}
void delMethod(String arg1, String arg2) {
}
void updateMethod(String arg1, String arg2) {
}
}
package com.example.demo.gczModel;
public class MetaDataFieldObserver extends MetaDataObserver{
@Override
void addMethod(String arg1, String arg2) {
}
@Override
void delMethod(String arg1, String arg2) {
}
@Override
void updateMethod(String arg1, String arg2) {
}
}
package com.example.demo.gczModel;
public class MetaDataViewObserver extends MetaDataObserver{
@Override
void addMethod(String arg1, String arg2) {
}
@Override
void delMethod(String arg1, String arg2) {
}
@Override
void updateMethod(String arg1, String arg2) {
}
}
测试使用类
package com.example.demo.gczModel;
public class test {
private MetaDataObservable metaDataObservable;
public test(){
this.metaDataObservable=new MetaDataObservable();
MetaDataObserver metaDataFieldObserver = new MetaDataFieldObserver();
MetaDataObserver metaDataViewObserver = new MetaDataViewObserver();
metaDataObservable.addObserver(metaDataFieldObserver);
metaDataObservable.addObserver(metaDataViewObserver);
}
public void operatedel(){
this.metaDataObservable.setDate("del","aaa","bbb");
}
public void operateadd(){
this.metaDataObservable.setDate("add","aaa","bbb");
}
public void main(String[] args) {
this.operateadd();
this.operatedel();
}
}