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");
}
}