設計模式-觀察者模式

觀察者模式(Observer pattern)

類型:行為相關

定義:在物件之間定義一個一對多的連接方法,當一個物件變換狀態時,其他關連的物件都會自動收到通知。

解釋:建立一個主體類別,讓其他觀察者可以向主體訂閱,主體可以統一通知這些觀察者資訊。

參與者有以下4個:

主體介面(Subject):定義主體外觀,可以訂閱、解除訂閱,當主體更新的時候可以統一通知有訂閱的觀察者。

主體實作(ConcreteSubject):實作主體介面。

觀察者介面(Observer):定義觀察者外觀,提供被通知時要用的方法。

觀察者實作(ConcreteObserver):實作觀察者介面內容。

在C#中請使用語言層次實做的event來取代觀察者模式,避免過度設計帶來的不必要複雜性。

 

精神:有事再做。

目的:將觀察者由主動的角色改為被動,提高主體對於提供資訊行為的內聚性,統一管理通的時機。

使用時機:當發生了某一件事後,有其他的物件需要被通知的時候(通常顯示的UI都有這種需求)。

優點:降低觀察者對主體的直接存取與統一管理室間發生的時機與通知的對象。

缺點:每次更新都要通知所有觀察者,當有很多不必要的通知時,可能會降低程式效率,而觀察者也不知道是因為甚麼原因而產生了這個通知。

 

簡易程式範例:

public abstract class Subject
{
    private List<Observer> observers = new List<Observer>();
    public void Register(Observer observer)
    {
        observers.Add(observer);
    }
    public void Deregister(Observer observer)
    {
        observers.Remove(observer);
    }
    public void Notify(/*資訊*/)
    {
        observers.ForEach(x => x.Update(/*資訊*/));
    }
}
public class ConcreteSubject : Subject
{ }
public interface Observer
{
    void Update(/*資訊*/);
}
public class ConcreteObserver : Observer
{
    public void Update(/*資訊*/)
    {
        //使用獲得的資訊
    }
}

UML 類圖(取自維基百科):

observer-svg
觀察者模式UML

observer-pattern-animation

1 thoughts on “設計模式-觀察者模式

發表留言