設計模式(8)觀察者模式-行爲型

定義

定義了對象之間的一對多依賴,這樣一來,當一個對象改變狀態時,它的所有依賴者都會收到通知並自動更新。

角色

抽象主題(ISubject)

定義主題中的要實現的方法,包括保存所有的觀察者,觀察者註冊,取消註冊(增刪)等。

主題類(ConcreteSubject)

實現了抽象主題中的具體方法。

抽象觀察者(IObserver)

定義觀察者要實現的方法,比如:更新,修改,回滾,顯示等方法。

觀察者類(ConcreteObserver)

實現抽象觀察者中的具體方法。

類圖

示例

觀察者模式算是比較好理解的一種模式。簡單示例如下:

public interface  ISubject{
void addObserver(IObserver obs);
void delObserver(IObserver obs);
void removerAll();
void notifyAll();
public class Subject implements ISubject{
List<IObserver> observerList = new ArraryList<IObserver>(); 
private int count;
void addObserver(IObserver obs)
{
   observerList .add(obs);
}
void delObserver(IObserver obs)
{
    observerList .remover(obs);
}
void removerAll()
{
    observerList.clear();
}
public void notifyAll()
{
    for(IObserver obs:allObserver)
    {
       obs.update(count);
       obs.display(count);
    }
}

public void setChange(int count)
{
    this.count = count;
    notifyAll();
}
public interface IObserver()
{
    boolean update(int count);
    boolean display(int count);
}
public class Observer implements IObserver
{
    private Subject subject = null;
    public Observer(Subject sub)
    {
        this.subject = sub;
        subject.addObserver(this);
    }
    private IDataDao dataDao = new DataDao();
    public boolean update(int count)
    {
        dataDao.update(count); //假設更新數據庫
    }
    public boolean display(int count)
    {
        System.out.println("display " + count);
    }
}
public class Test {
    public static void main(String[] args){
        Subject subject = new Subject();
        Observer observer = new Observer(subject);
        int count = 20;
        subject.setChange(count);
        int count2 = 30;
        subject.setChange(count2);
    }
}

要點

1.定義了對象之間一對多的關係
2.觀察者和可觀察者之間用鬆耦合方式結合,可觀察者不知道觀察者的細節,只知道觀察者實現了接口中的方法
3.有多個觀察者時,不可以依賴特定的統治次序

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