java觀察者模式

案例:

  • 定義被觀察者
/**
 * @author Gjing
 * 抽象被觀察者
 **/
abstract class AbstractSubject {
    /**
     * 觀察者對象的集合
     */
    private List<Listener> listenerList = new ArrayList<>();

    /**
     * 添加觀察者
     *
     * @param listener 觀察者
     */
    void add(Listener listener) {
        listenerList.add(listener);
    }

    /**
     * 通知所有觀察者
     */
    void notifyObserver() {
        for (Listener listener : listenerList) {
            listener.update("通知所有觀察者,按鈕被點擊。。。。。。");
        }
    }
}

/**
 * @author Gjing
 * 具體被觀察者
 **/
class AbstractSubjectA extends AbstractSubject {
    void click() {
        System.out.println("按鈕被點擊");
        notifyObserver();
    }
}
  • 定義觀察者
/**
 * @author Gjing
 * 抽象觀察者
 **/
public interface Listener {
    String getName();

    /**
     * 通知更新方法
     *
     * @param message 消息
     */
    void update(String message);
}

/**
 * @author Gjing
 * A觀察者
 **/
class ListenerA implements Listener {
    @Override
    public String getName() {
        return "觀察者A";
    }

    @Override
    public void update(String message) {
        System.out.println("觀察者A收到消息更新:" + message);
    }
}

/**
 * @author Gjing
 * 觀察者B
 **/
class ListenerB implements Listener {
    @Override
    public String getName() {
        return "觀察者B";
    }

    @Override
    public void update(String message) {
        System.out.println("觀察者B收到消息更新:" + message);
    }
}
  • 調用
/**
 * @author Gjing
 **/
public class Test {
    public static void main(String[] args) {
        //創建被觀察者
        AbstractSubjectA subjectA = new AbstractSubjectA();
        //添加觀察者
        subjectA.add(new ListenerA());
        subjectA.add( new ListenerB());
        //被觀察者行動
        subjectA.click();
    }
}

優點

  1. 觀察者和被觀察者之間抽象耦合。觀察者模式容易擴展,被觀察者只持有觀察者集合,並不需要知道具體觀察者內部的實現。
  2. 對象之間的保持高度的協作。當被觀察者發生變化時,所有被觀察者都會通知到,然後做出相應的動作。

缺點

  1. 如果觀察者太多,被觀察者通知觀察者消耗的時間很多,影響系統的性能。
  2. 當觀察者集合中的某一觀察者錯誤時就會導致系統卡殼,因此一般會採用異步方式。

以上爲個人理解,如有誤歡迎各位指正

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章