觀察者模式(Observer)

觀察者模式git

一. 觀察者模式

1.1 定義

  • 定義對象間一種一對多的依賴關係,使得當每個對象改變狀態,則全部依賴於他的對象都會獲得通知,並自動更新.

1.2 角色

  • 抽象觀察者角色(IObserver).
  • 抽象被觀察者角色(ISubject).
  • 具體觀察者角色(Observer).
  • 具體被觀察者角色(Subject).

1.3 模式

  • 拉模式:只通知是否變化而沒有具體細節.
  • 推模式:會通知具體細節.

二. 具體實現

2.1 建立觀察者抽象接口

public interface IObserver {
        void update();
    }

2.2 建立具體觀察者

public class ObserverA implements IObserver {
        @Override
        public void update() {
            System.out.println("ObserverA update ...");
        }
    }
    public class ObserverB implements IObserver {
        @Override
        public void update() {
            System.out.println("ObserverB update ...");
        }
    }

2.3 建立被觀察者對象

public class Subject {
        List<IObserver> observerList = new ArrayList<>();
        public void addObserver(IObserver observer){
            if(!observerList.contains(observer)){
                observerList.add(observer);
            }
        }
        public void change (){
            System.out.println("Subject change ...");
            notifyObservers();
        }
        public void notifyObservers(){
            for(IObserver observer : observerList){
                observer.update();
            }
        }
    }

2.4 調用

public static void main(String[] args) {
        Subject subject = new Subject();
        IObserver observerA = new ObserverA();
        IObserver observerB = new ObserverB();
        subject.addObserver(observerA);
        subject.change();
        subject.addObserver(observerB);
        subject.change();
    }

2.5 輸出

Subject change ...
    ObserverA update ...
    Subject change ...
    ObserverA update ...
    ObserverB update ...

三. 優缺點

3.1 優勢

  • 觀察者與被觀察者抽象耦合,容易擴展.
  • 創建了一套觸發機制.

3.2 缺點

  • 循環依賴會致使系統崩潰.
  • 觀察者太多會浪費時間.

四. 源碼

https://github.com/Seasons20/DisignPattern.git
相關文章
相關標籤/搜索