概念:
脑海里想象为个人手机订阅的新闻,只有新闻软件有重大的更新则会推送到你的手机上。
考虑如下场景:
系统每次生成一个工单,需要同步数据给CRM和HB,当然对于这两个系统的各自关系的东西是不一样的,则抽象出如下:
MessageSender(订阅者/消息发送者),CRMObserver(CRM的接收者),HBObserver(HB的接收者)
public abstract class SystemInterface {
/**
* 观察者列表
*/
private List<Observer> observerList = new ArrayList<Observer>();
/**
* 登记观察者
* @param observer
*/
public void attach(Observer observer){
observerList.add(observer);
System.out.println("add an observer");
}
/**
* 删除观察者对象
* @param observer 观察者对象
*/
public void detach(Observer observer){
observerList.remove(observer);
System.out.println("delete an observer");
}
/**
* 通知所有注册的观察者对象
*/
public void nodifyObservers(String newState){
for(Observer observer : observerList){
observer.update(newState);
}
}
/**
* 通知完毕后变更状态
* @param newState
*/
public abstract void change(String newState);
}
public class MessageSender extends SystemInterface {
private String state;
public String getState() {
return state;
}
public void change(String newState){
state = newState;
System.out.println("主题状态为:" + state);
//状态发生改变,通知各个观察者
this.nodifyObservers(state);
}
}
public interface Observer {
/**
* 更新的状态
* @param state
*/
public void update(String state);
}
public class CRMObserver implements Observer {
//观察者的状态
private String observerState;
@Override
public void update(String state) {
/**
* 更新观察者的状态,使其与目标的状态保持一致
*/
observerState = state;
System.out.println("CRM收到状态为:"+observerState);
}
}
public class HBObserver implements Observer {
private String observerState;
@Override
public void update(String state) {
observerState = state;
System.out.println("HB收到状态为:"+observerState);
}
}
public class Client {
/**
* @param args
* @throws IllegalAccessException
* @throws InstantiationException
*/
public static void main(String[] args) throws InstantiationException, IllegalAccessException {
String[] observersArray = new String[]{
"study.CRMObserver",
"study.HBObserver"
};
Class<?>[] observerClass = new Class<?>[observersArray.length];
for (int i = 0; i < observerClass.length; i++) {
try {
observerClass[i] = Class.forName(observersArray[i]);
} catch (ClassNotFoundException e) {
System.out.println("类没找到" + observersArray[i]);
e.printStackTrace();
}
}
//创建主题对象
SystemInterface msgSender = new MessageSender();
for(Class<?> observer : observerClass){
//将观察者对象登记到主题对象上
msgSender.attach((Observer)observer.newInstance());
}
//改变主题对象的状态
msgSender.change("new state");
}
}
消息转发类注册了CRM和HB的观察者,调用change的时候传入处理的状态,或者说应该这个状态而导致了消息转发类去通知了CRM和HB,在change方法中通知了所有的注册者,消息得以转发。
结果:
add an observer
add an observer
主题状态为:new state
CRM收到状态为:new state
HB收到状态为:new state