Observer模式是適當用一些specializaiton。 EventAggregator模式是這種類型場景的觀察者模式的更專業版本。事件聚合器模式對於這種情況非常理想。
簡而言之,事件聚合器允許您集中發佈/訂閱事件。因此,所有訂閱者和發佈者只與EventAggregator交談。訂戶訂閱事件和發佈者命令事件聚合器發佈內容。
事件聚合器模式也將每個發佈者訂閱者彼此分開。這消除了子表單引用父表單的需要。
傑里米米勒在他的建立自己的駕駛室系列中提供了一個很好的例子。由於我的新會員資格,我無法發佈鏈接到網站,但只是搜索下列項目。
EventAggregator由Martin Fowler 通過傑里米米勒建立自己的CAB系列(codebetter.com) EventAggregator在PRISM
下面是一個簡單的例子,我做了使用C#和泛型。這絕不是完整的。這只是爲了舉例說明一個簡單的例子。爲了更完整的模式轉向傑里米米勒斯的例子。使用系統
[代碼]
//示例自定義事件參數 ;
命名空間EventAggregatorPatternDemo { 公共類CloseAllFormsEventArgs:EventArgs的 {} } 使用系統
//表格樣本代碼 ; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing;使用System.Linq的 ; using System.Text;使用System.Windows.Forms的 ;
命名空間EventAggregatorPatternDemo { 公共部分類GraphForm:形式,IListener { 公共GraphForm() { 的InitializeComponent(); }
private void GraphForm_Load(object sender, EventArgs e)
{
EventAggregator.GetTheEventAggregator().Subscribe<CloseAllFormsEventArgs>(this);
}
public void Handle<TEventArgs>(TEventArgs e)
{
if (e.GetType() == typeof(CloseAllFormsEventArgs))
{
this.Close();
}
}
private void btnCloseAll_Click(object sender, EventArgs e)
{
EventAggregator.GetTheEventAggregator().Publish(this, new CloseAllFormsEventArgs());
}
private void GraphForm_FormClosed(object sender, FormClosedEventArgs e)
{
EventAggregator.GetTheEventAggregator().CancelSubscription<CloseAllFormsEventArgs>(this);
}
}
}
//事件聚合代碼 使用系統; using System.Collections.Generic;
命名空間EventAggregatorPatternDemo { 公共接口IListener { 空隙句柄(TEventArgs E); }
public class EventAggregator
{
static EventAggregator _TheEventAggregator;
readonly Dictionary<Type, List<IListener>> _listeners;
private EventAggregator()
{
_listeners = new Dictionary<Type, List<IListener>>();
}
public static EventAggregator GetTheEventAggregator()
{
if(_TheEventAggregator == null)
{
_TheEventAggregator = new EventAggregator();
}
return _TheEventAggregator;
}
public void Publish<TEventArgs>(object sender, TEventArgs e)
{
if(_listeners.ContainsKey(e.GetType()))
{
var listOfSubscribers = _listeners[e.GetType()];
for(int i = listOfSubscribers.Count - 1; i > -1; i--)
{
listOfSubscribers[i].Handle(e);
}
}
}
public void Subscribe<TEventArgs>(IListener listener)
{
if(_listeners.ContainsKey(typeof(TEventArgs)))
{
_listeners[typeof(TEventArgs)].Add(listener);
}
else
{
List<IListener> newListenerList = new List<IListener>();
newListenerList.Add(listener);
_listeners.Add(typeof(TEventArgs), newListenerList);
}
}
//Cancels all subscriptions
public void CancelSubscription<TEventArgs>(IListener listener)
{
Type eventArgsType = typeof(TEventArgs);
if (_listeners.ContainsKey(eventArgsType))
{
//Remove from the end
for (int i = _listeners[eventArgsType].Count-1; i > -1; i--)
{
//If the objects are the same
if(ReferenceEquals(_listeners[eventArgsType][i], listener))
{
_listeners[eventArgsType].RemoveAt(i);
}
}
}
}
}
} [/代碼]
我能看到的是你有很多形式和按鈕! – 2009-12-30 05:18:22
不,只有三種形式和六個按鈕 – Harikrishna 2009-12-30 05:21:55