在觀察者模式中,MessageSubject 扮演具體主題角色,負責維護觀察者清單並在狀態變更時通知所有觀察者。以下是完整的 C# 實作碼:
using System;
using System.Collections.Generic;
using System.Text;
namespace Pattern.Observer
{
///
/// Message 主題(ConcreteSubject)
///
public class MessageSubject : AbstractMessageSubject
{
///
/// 建構函式
///
/// Message 實體物件
public MessageSubject(MessageModel mm)
: base(mm)
{
}
}
}
以下展示如何在 ASP.NET 網頁中使用觀察者模式,建立主題並註冊兩個觀察者(SQL 與 XML 存儲方式):
using System;
using System.Data;
using System.Configuration;
using System.Collections;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
using Pattern.Observer;
public partial class Observer : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
MessageSubject m = new MessageSubject(new MessageModel("插入Message", DateTime.Now));
SqlMessage sqlMessage = new SqlMessage();
XmlMessage xmlMessage = new XMLMessage();
m.Attach(sqlMessage);
m.Attach(xmlMessage);
// System.Threading.Thread.Sleep(1000);
// 修改 PublishTime 就會通知所有觀察者
// m.PublishTime = DateTime.Now;
Response.Write(m.Notify());
}
}
sql方式:插入Message 2007-5-26 9:38:18
XML方式:插入Message 2007-5-26 9:38:18
當主題的 PublishTime 屬性被修改時,所有已註冊的觀察者都會收到通知並執行各自的處理邏輯,完美展示了觀察者模式「一對多」依賴關係的鬆耦合特性。