Õâ´ÎÎÒÃÇÀ´¿´¿´IssueVisionÖеĶÔÉè¼ÆÄ£Ê½µÄÓ¦ÓÃ,IssueVisionÖ÷ҪʹÓÃÁËOBSERVER(¹Û²ìÕß)ģʽºÍCOMMAND(ÃüÁî)ģʽ.½ñÌì¾ÍÀ´¿´¿´OBSERVER(¹Û²ìÕß)ģʽÔÚIssueVisionÖеÄÓ¦ÓÃ,ËüÔÚIssueVisionÖаçÑÝ×ÅÖØÒª½ÇÉ«.
"ËÄÈ˰ï"GoFÊÇÕâÑù¶¨ÒåOBSERVER(¹Û²ìÕß)ģʽµÄ------¶¨Òå¶ÔÏó¼äµÄÒ»ÖÖÒ»¶Ô¶àµÄ¹ØÏµ,µ±Ò»¸ö¶ÔÏóµÄ״̬·¢Éú¸Ä±äʱ,ËùÓÐÒÀÀµËüµÄ¶ÔÏ󶼵õ½Í¨Öª,²¢±»×Ô¶¯¸üÐÂ.
´Ó¶¨Òå¿ÉÒÔ¿´³ö,OBSERVER(¹Û²ìÕß)ģʽÂß¼ÉÏÐèÒªÁ½×é¶ÔÏóÀ´ÊµÏÖ.Ê×ÏÈËü±ØÐèÒªÓз¢²¼Õß(Publish),Ò²¿É³ÆÎª±»¹Û²ìµÄÄ¿±ê(Subject)(ϰ¹ßÉ϶¼³ÆËüΪĿ±êSubject,ºóÃæÎÒÃǶ¼³ÆËü×÷Ä¿±êSubject),ÁíÍâ¾ÍÊǶ©ÔÄÕß(Subscribe),ϰ¹ßÉϳÆÎª¹Û²ìÕß(Observer).Ò»¸öÄ¿±ê¶ÔÏó¶ÔÓ¦¶à¸ö¹Û²ìÕß¶ÔÏó,Ä¿±ê¶ÔÏó·¢Éú±ä»¯Ê±,ËùÓÐÔÚÄ¿±ê¶ÔÏóÖÐ×¢²áµÄ¹Û²ìÕß¶ÔÏó»áµÃµ½Í¨Öª,×Ô¶¯¸üÐÂ×Ô¼º.
ÔÚÓ¦ÓóÌÐò¿ª·¢¹ý³ÌÖÐ,ÍùÍù¶¼ÒªÇóÓû§½çÃæºÍÒµÎñÂß¼·ÖÀë,»®¶¨ÇåÎúµÄ½çÏÞ.ÒòΪӦÓóÌÐòÒªÇóÄÜ¿ìËٵĸü¸ÄÓû§½çÃæ²¢ÇÒ²»ÄܶÔÓ¦ÓóÌÐòÆäËû²¿·Ö²úÉúÁ¬´øÓ°Ïì,¶øÇÒÒµÎñÂß¼Ò²»á·¢Éú±ä»¯²¢ÒªÇóÕâÒ»Çб仯ÓëÓû§½çÃæÎÞ¹Ø.¹Û²ìÕß(Observer)¾ÍÊǽâ¾ö´ËÎÊÌâ×î³£ÓõÄÉè¼ÆÄ£Ê½,Ëü·Ç³£ÓÐÖúÓÚÔÚϵͳÖи÷¸ö¶ÔÏóÖ®¼ä»®·ÖÇåÎúµÄ½çÏÞ.
ÏÂͼ×îºÃµÄչʾÁËÕâÖÖÐÎʽ,¹ÛÕßÕß(observer)ÃÇ(±í¸ñ¶ÔÏó,Öù״ͼ¶ÔÏóºÍ±ý״ͼ¶ÔÏó)¶¼ÒÀÀµÊý¾Ý¶ÔÏóSubject,ËùÒÔÊý¾Ý¶ÔÏóSubjectµÄËùÓиı䶼»á֪ͨËüÃÇ.µ«ËüÃÇ»¥ÏàÖ®¼ä²¢²»ÖªµÀ¶Ô·½µÄ´æÔÚ,±í¸ñ¶ÔÏó²»ÖªµÀÆäËû±í¸ñ¶ÔÏó»òÕ߯äËûÖù״ͼ¶ÔÏóµÄ´æÔÚ.¶ÔÓÚÊý¾Ý¶ÔÏóSubject¿ÉÒÔÓÐÈκζàµÄ¹Û²ìÕß,ÕâЩ¹Û²ìÕß¶¼ÄÜÔÚSubject¶ÔÏó·¢Éú¸Ä±äʱµÃµ½Í¨Öª,ʹ×Ô¼ºµÄ״̬ÓëSubjectͬ²½:

ºÃ°É,¸ÅÄî¾Í˵Õâô¶à°É,ÎÒÃÇÀ´¿´Ò»ÏÂOBSERVER(¹Û²ìÕß)ģʽµÄʵÏÖ.ͨÓõÄOBSERVER(¹Û²ìÕß)ģʽµÄʵÏÖÎÒÔÚÕâ¾Í²»ËµÁË,¿ÉÒԲο¼GoFµÄÉè¼ÆÄ£Ê½ºÍJavaÓëģʽµÈÊé.ÎÒÃǾÍÀ´×¨×¢ÓÚ.NET¿ò¼ÜÖÐOBSERVER(¹Û²ìÕß)ģʽµÄʵÏÖ.
.NET¿ò¼ÜÒýÈëÁËίÍкÍʼþ,ËüÃÇÌṩÁ˸üÐÂ,¹¦ÄܸüÇ¿´óµÄ·½·¨À´ÊµÏÖOBSERVER(¹Û²ìÕß)ģʽ.(¹ØÓÚίÍкÍʼþµÄ¸ü¶àÄÚÈÝÇë²Î¿¼Ïà¹ØÎĵµ).Èç¹ûÄã²»ÊìϤίÍкÍʼþ,ʵÏÖOBSERVER(¹Û²ìÕß)ģʽÔòÐèÒª×÷ºÜ¶à¹¤×÷(ÏñÔÚJavaÖÐʵÏÖÄÇÑù).ÏÂÃæÎÒ¾ÍÒÔIssueVisionÖеÄʵÏÖÀ´¼òµ¥½²ÊöÒ»ÏÂ.
ÔÚIssueVisionÖÐPatternsÎļþ¼ÐÏÂÓÐÁ½¸öÎļþISubject.csºÍIObserver.cs.ËüÃÇ·Ö±ð¶¨ÒåÁËÄ¿±ê(Subject)¶ÔÏóºÍ¹ÛÕßÕß(Observer)¶ÔÏóµÄ½Ó¿Ú,´úÂëÈçÏÂ:
ISubject.cs
namespace IssueVision
{
// ISubject is a simple marker interface that supports the implementation
// of the Observer pattern in IssueVision.
public interface ISubject
{
}
}
IObserver.cs
namespace IssueVision
{
// IObserver is a simple interface that supports the implementation of the
// Observer pattern in IssueVision.
public interface IObserver
{
ISubject Subject
{
set;
}
}
}
´ó¼Ò¿ÉÄÜ·¢ÏÖ,ÕâÁ½¸ö½Ó¿Ú¼¸ºõΪ¿Õ,ʲô¶¼Ã»Óж¨Òå,ÄÇÕâÁ½¸ö½Ó¿ÚµÄ×÷ÓÃÊÇÊ²Ã´ÄØ?Æäʵ¶¨ÒåÕâÁ½¸ö½Ó¿ÚµÄ×÷ÓÃÖ÷ҪΪ±àÂëµÄ"¹æ·¶»¯",Ö»ÒªÀàʵÏÖÁËÕâÁ½¸ö½Ó¿ÚÈκÎÒ»¸ö,ÄÇô¾Í´ú±í´ËÀà¾ÍʵÏÖÁËOBSERVER(¹Û²ìÕß)ģʽ,²¢ÇÒºÜÃ÷ÏÔµÄÖªµÀËÊÇSubject,ËÊÇObserver.
IssueVisionÖеÄIssueSubject×é¼þ¾ÍʵÏÖISubject½Ó¿Ú,ËüÊÇIssueVisionÖÐʵÏÖOBSERVER(¹Û²ìÕß)ģʽ×îÖ÷ÒªµÄ²¿·Ö,Ò²ÊÇIssueVisionÖÐ×î×ÔÓµÄÒ»¸öÀà.ÎÒÃÇÂýÂýÒ»µãÒ»µãÀ´·ÖÎöËü(µ±È»Ö®·ÖÎöOBSERVER(¹Û²ìÕß)ģʽÏà¹Ø²¿·Ö):
IssueSubject.cs
public class IssueSubject : Component, ISubject
Ê×Ïȶ¨ÒåÀàIssueSubject¼Ì³Ð×ÔComponentºÍISubject,´ÓÕâÀïºÍÀàÃû¿ÉÒÔ¿´³ö,´ËÀàÊÇ×÷ΪOBSERVER(¹Û²ìÕß)ģʽÖеÄÄ¿±ê(Subject)ʵÏÖµÄ.Ä¿±ê(Subject)¶ÔÏóÒªÇóʵÏÖ¶Ô¹Û²ìÕß(Observer)µÄ×¢²á(Register)ºÍ֪ͨ,ComponentÀà¾ÍÊÇÓÃÀ´ÊµÏÖ×¢²á(Register)µÄ.´ó¶àÊýÄ¿±ê(Subject)¶ÔÏóµÄʵÏÖ²¢²»ÊDz¢·Ç½«¹Û²ìÕß(Observer)µÄÒýÓÃÖ±½Ó´æ´¢ÔÚ×Ô¼ºµÄʵÀý±äÁ¿ÖÐ,¶øÊǽ«´ËÈËÎïίÍиøÒ»¸öµ¥¶ÀµÄ¶ÔÏó(ͨ³£ÎªÒ»¸öÈÝÆ÷)ComponentÀà¾ÍÊÇÕâÑùÒ»¸öÈÝÆ÷,ÏÂÃæ´úÂëÏÔʾÁËÈçºÎÓÃComponentÀàÈÝÆ÷À´´æ´¢¶Ô¹Û²ìÕß(Observer)¶ÔÏóµÄÒýÓÃ×¢²á(Register)
public IssueSubject(IContainer Container) : this()
{
Container.Add(this);
}
ÎÒÃÇÀ´¿´Ò»ÏÂËüÊÇÈçºÎÍê³É×¢²á(Register)µÄ,Ê×ÏÈÎÒÃÇÕÒµ½Ò»¸ö¹Û²ìÕß(Observer)¶ÔÏóµÄʵÏÖ,Controls/IssueTreeView Óû§¿Ø¼þ¾ÍÊÇÒ»¸ö¹Û²ìÕß(Observer)¶ÔÏó.ËüʵÏÖÁËIObserver½Ó¿Ú.
Controls/IssueTreeView.cs
namespace IssueVision
{
// The IssueTreeView user control implements the view selection ui for IssueVision
public class IssueTreeView : UserControl, IObserver
{
.....
private TreeView trvViews;
private ImageList images;
private IssueSubject m_subject = null;
private const string m_fontname = "Tahoma";
private IContainer components;
public virtual ISubject Subject //ISubject½Ó¿ÚµÄ·½·¨
{
set
{
m_subject = (IssueSubject)value;
.....
}
}
Pane/StaffPaneÓû§¿Ø¼þÒýÓÃÁË´ËIssueTreeView,ËüͬÑùÒ²Êǹ۲ìÕß(Observer)¶ÔÏó.
Pane/StaffPane.cs
namespace IssueVision
{
public class StaffPane : UserControl, IObserver
{
....
private IssueTreeView itvViews;
private IContainer components = null;
// IObserver.Subject
public ISubject Subject
{
set
{
itvViews.Subject = (IssueSubject)value;
}
}
ÔÚMainForm.csÖе÷ÓôËÓû§¿Ø¼þ´úÂëÈçÏÂ:
private IssueSubject m_issueSubject = null;
.....
m_issueSubject = new IssueSubject(this.components); //µ÷ÓÃIssueSubjectµÄ¹¹Ô캯Êý
paneStaff.Subject = m_issueSubject;
ͨ¹ýµ÷ÓÃIssueSubjectµÄ¹¹Ô캯Êý,ÊǴ˹۲ìÕß(Observer)¶ÔÏó×¢²áµ½ÁËÄ¿±ê(Subject)¶ÔÏóÖÐ.(ͨ¹ýÈÝÆ÷µÄContainer.Add())
ÕâÑù¾ÍÍê³ÉÁËOBSERVER(¹Û²ìÕß)ģʽµÄµÚÒ»²½,¹Û²ìÕß(Observer)¶ÔÏóµÄ×¢²á.ÏÂÃæÎÒÃÇÀ´¿´µÚ¶þ²½,Ä¿±ê(Subject)¶ÔÏóÈçºÎ֪ͨ¹Û²ìÕß(Observer)¶ÔÏó
Õâ¾ÍÐèҪʹÓõ½Î¯ÍкÍʼþÁË.ÔÚ»ØÀ´¿´IssueSubject
IssueSubject.cs
public class IssueSubject : Component, ISubject
{
#region Delagate and Event Declarations
.......
public delegate void ConflictDataChangedEventHandler(object sender, EventArgs e);
public delegate void LookupDataChangedEventHandler(object sender, EventArgs e);
// ConflictDataChanged changes when a conflict is resolved, or new conflicts are
// detected.
public virtual event ConflictDataChangedEventHandler ConflictDataChanged;
// LookupDataChanged is raised when lookup data is downloaded from the server
public virtual event LookupDataChangedEventHandler LookupDataChanged;
......
ÔÚIssueSubjectÖÐÉêÃ÷ίÍкÍʼþ,¹Û²ìÕß(Observer)¶ÔÏóµÇ¼ÇÕâЩʼþ,ÄÇôµ±IssueSubject¸Ä±äºó,¼¤»îÒ»¸öʼþ,ÄÇôËùÓеĹ۲ìÕß(Observer)¶ÔÏó¶¼Äܵõ½Õâ¸ö¸Ä±äµÄ֪ͨ,´Ó¶ø¼¤»îÏàÓ¦µÄ´¦Àí.
ÔÙ¿´Controls/IssueTreeView.cs
namespace IssueVision
{
// The IssueTreeView user control implements the view selection ui for IssueVision
public class IssueTreeView : UserControl, IObserver
{
.....
private TreeView trvViews;
private IssueSubject m_subject = null;
private IContainer components;
public virtual ISubject Subject //ISubject½Ó¿ÚµÄ·½·¨
{
set
{
m_subject = (IssueSubject)value;
//µÇ¼ÇIssueSubjectµÄʼþ,²¢½»¸øÏà¹Ø·½·¨´¦Àíʼþ
m_subject.LookupDataChanged += new IssueSubject.LookupDataChangedEventHandler(this.Subject_LookupDataChanged);
m_subject.ConflictDataChanged += new IssueSubject.ConflictDataChangedEventHandler(this.Subject_ConflictDataChanged);
}
}
×îºó,ÔÚIssueSubjectÖ줻îÕâЩʼþ.
IssueSubject.cs
private void LoadIssueData()
{
.......
m_dataSet.DataSetName = "IssueSubject";
if (LookupDataChanged != null)
{
LookupDataChanged(this, EventArgs.Empty);
}
}
ͨ¹ýÕâô¼òµ¥µÄ¼¸¸ö²½Öè,¾ÍʵÏÖÁËOBSERVER(¹Û²ìÕß)ģʽ,.NET¿ò¼ÜÌṩµÄίÍкÍʼþ»úÖÆºÜ´óµÄ¼ò»¯ÁËģʽµÄʵÏÖ.
CopyRight © YellowWee 2004. All Right Reserved.

