設計模式學習(十三):觀察者模式

2022-11-12 06:01:22

設計模式學習(十三):觀察者模式

作者:Grey

原文地址:

部落格園:設計模式學習(十三):觀察者模式

CSDN:設計模式學習(十三):觀察者模式

觀察者模式

觀察者模式是一種行為型模式。在物件之間定義一個一對多的依賴,當一個物件狀態改變的時候,所有依賴的物件都會自動收到通知。

一般可以用做事件處理往往和責任鏈模式搭配使用, 舉個例子:

介面上的按鈕上一般都可以繫結事件,當我們按下按鈕的時候,可以觸發這些事件的執行,這裡就可以用觀察者模式來做, 我們先定義按鈕這個物件

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 圖如下

觀察者模式的應用

UML 和 程式碼

UML 圖

程式碼

更多

設計模式學習專欄

參考資料