作者:Grey
原文地址:
觀察者模式是一種行為型模式。在物件之間定義一個一對多的依賴,當一個物件狀態改變的時候,所有依賴的物件都會自動收到通知。
一般可以用做事件處理往往和責任鏈模式搭配使用, 舉個例子:
介面上的按鈕上一般都可以繫結事件,當我們按下按鈕的時候,可以觸發這些事件的執行,這裡就可以用觀察者模式來做, 我們先定義按鈕這個物件
public class Button {
private List<ActionListener> listeners = new ArrayList<>();
public void addActionListener(ActionListener listener) {
this.listeners.add(listener);
}
@Override
public String toString() {
return "Button{" + "listeners=" + listeners + '}';
}
public void buttonPressed() {
ActionEvent event = new ActionEvent(System.currentTimeMillis(), this);
listeners.forEach(item -> item.actionPerformed(event));
}
}
由上可知,Button 中持有了一個列表,這個列表裡面裝的就是所有事件的列表,我們可以把事件繫結到這個按鈕的事件列表中,這樣就可以實現按鈕執行 press 操作的時候,把對應的事件觸發執行了
public interface ActionListener {
void actionPerformed(ActionEvent event);
}
模擬兩個監聽事件
public class Listener1 implements ActionListener {
@Override
public void actionPerformed(ActionEvent event) {
System.out.println("Listener 1 listened it source: [" + event.getSource() + "], when is [" + event.getWhen() + "]");
}
}
public class Listener2 implements ActionListener {
@Override
public void actionPerformed(ActionEvent event) {
System.out.println("Listener 2 listened it source: [" + event.getSource() + "], when is [" + event.getWhen() + "]");
}
}
主方法在呼叫的時候,將按鈕繫結上述兩個監聽事件:
public class Main {
public static void main(String[] args) {
Button button = new Button();
button.addActionListener(new Listener1());
button.addActionListener(new Listener2());
button.buttonPressed();
}
}
當執行
button.buttonPressed()
的時候,對應的 listener1 和 listener2 就可以執行了。
上述過程的 UML 圖如下
觀察者模式的應用
郵件訂閱、RSS Feeds,本質上都是觀察者模式。
本文來自部落格園,作者:Grey Zeng,轉載請註明原文連結:https://www.cnblogs.com/greyzeng/p/16882100.html