1. 程式人生 > >Java常用設計模式——觀察者模式

Java常用設計模式——觀察者模式

ray stat param servers face oid println override 角色

觀察者模式又叫做發布-訂閱-模式、模型-視圖-模式、源-監聽器-模式或者從屬者模式。觀察者模式定義了一種一對多的依賴關系,讓多個觀察者對象同時監聽某一個主題對象。這個主題對象在狀態上發生變化時,會通知所有觀察者對象,使它們能夠自動更新自己,它是一種行為型模式

觀察者模式所涉及的角色有:

  • 抽象主題(Subject)角色:抽象主題角色把所有對觀察者對象的引用保存在一個聚集(比如ArrayList對象)裏,每個主題都可以有任何數量的觀察者。抽象主題提供一個接口,可以增加和刪除觀察者對象,抽象主題角色又叫做抽象被觀察者(Observable)角色
  • 具體主題(ConcreteSubject)角色:
    將有關狀態存入具體觀察者對象;在具體主題的內部狀態改變時,給所有登記過的觀察者發出通知。具體主題角色又叫做具體被觀察者(Concrete Observable)角色 
  • 抽象觀察者(Observer)角色:為所有的具體觀察者定義一個接口,在得到主題的通知時更新自己,這個接口叫做更新接口
  • 具體觀察者(ConcreteObserver)角色:存儲與主題的狀態自恰的狀態。具體觀察者角色實現抽象觀察者角色所要求的更新接口,以便使本身的狀態與主題的狀態 像協調。如果需要,具體觀察者角色可以保持一個指向具體主題對象的引用

定義抽象主題角色

package com.observerpattern;

/** * @author yyx 2017年10月10日 */ public interface Subject { /** * 添加觀察者對象 * * @param observer */ public void addObserver(Observer observer); /** * 移除觀察者對象 * * @param observer */ public void removeObserver(Observer observer); /** * 更新觀察者對象信息
*/ public void notifyObservers(); }

定義具體主題角色

package com.observerpattern;

import java.util.ArrayList;
import java.util.List;

/**
 * @author yyx 2017年10月10日
 */
public class ConcreteSubject implements Subject {
    private List<Observer> observerList = new ArrayList<Observer>();

    @Override
    public void addObserver(Observer observer) {
        observerList.add(observer);
    }

    @Override
    public void removeObserver(Observer observer) {
        observerList.remove(observer);
    }

    @Override
    public void notifyObservers() {
        for (Observer observer : observerList) {
            observer.update();
        }
    }

}

定義抽象觀察者角色

package com.observerpattern;

/**
 * @author yyx 2017年10月10日
 * 抽象觀察者角色
 */
public interface Observer {
    public void update();
}

定義具體觀察者角色

package com.observerpattern;

/**
 * @author yyx 2017年10月10日
 * 具體觀察者角色
 */
public class ConcreteObserverFirst implements Observer {

    @Override
    public void update() {
        System.out.println("我是第一個實現Observer接口的類");
    }
}


package com.observerpattern;

/**
 * @author yyx 2017年10月10日
 * 具體觀察者角色
 */
public class ConcreteObserverSecond implements Observer {

    @Override
    public void update() {
        System.out.println("我是第二個實現Observer接口的類");
    }

}

定義測試類

package com.observerpattern;

/**
 * @author yyx 2017年10月10日
 */
public class PatternTest {
    public static void main(String[] args) {
        Subject subject = new ConcreteSubject();
        Observer observerFirst = new ConcreteObserverFirst();
        Observer observerSecond = new ConcreteObserverSecond();
        subject.addObserver(observerFirst);
        subject.addObserver(observerSecond);
        subject.notifyObservers();
    }
}
運行結果:        我是第一個實現Observer接口的類        我是第二個實現Observer接口的類

Java常用設計模式——觀察者模式