GoF设计模式里面的观察者模式的UML图
PS:发布和订阅(事件监听,mq,多路IO复用)
例如:XX楼盘5-1开盘,你肯定不知道,如果你想知道,肯定要去楼盘登记,留下电话号5-1号销售就会打电话通知你。
Subject 就是抽象主题:它负责管理所有观察者的引用,同时定义主要的事件操作。
ConcreteSubject 具体主题:它实现了抽象主题的所有定义的接口,当自己发生变化时,会通知所有观察者。
Observer 观察者:监听主题发生变化相应的操作接口。
代码案例
public class EventObject implements Serializable {
private String type;
private Object data;
public EventObject(String type, Object data) {
this.type = type;
this.data = data;
}
public String getType() {
return type;
}
public Object getData() {
return data;
}
}
//subject
public interface Lifecycle {
public void addLifecycleListener(LifecycleListener listener);
public void removeLifecycleListener(LifecycleListener listener);
public void fireLifecycleEvent(String type,Object data);
}
//ConcreteSubject
public class LifecycleSubject implements Lifecycle {
private CopyOnWriteArrayList<LifecycleListener> cwal = new CopyOnWriteArrayList();
@Override
public void addLifecycleListener(LifecycleListener listener) {
cwal.add(listener);
}
@Override
public void removeLifecycleListener(LifecycleListener listener) {
cwal.remove(listener);
}
@Override
public void fireLifecycleEvent(String type, Object data) {
EventObject event = new EventObject(type, data);
for (int i = 0; i < cwal.size(); i++) {
cwal.get(i).lifecycleEvent(event);
}
}
}
//观察者行为
public interface LifecycleListener {
public void lifecycleEvent(EventObject event);
}
//具体的观察者
public class ObserverSubject implements LifecycleListener {
@Override
public void lifecycleEvent(EventObject event) {
System.out.println(event.getType() + "=" + event.getData());
}
}
public class Client {
public static void main(String[] args) {
LifecycleSubject lifecycleSubject = new LifecycleSubject();
lifecycleSubject.addLifecycleListener(new ObserverSubject());
lifecycleSubject.fireLifecycleEvent("start", "how are you");
}
}