¡¾·±ÌåÖÐÎÄ¡¿
¡¾ÉèΪÊ×Ò³¡¿
¡¾¼ÓÈëÊղء¿
µ±Ç°Î»Öãº.Net¼¼ÊõÊ×Ò³ >> ÆÀÂÛ¼°ÆäËü >> [Ô­´´]IssueVision ѧϰ±Ê¼Ç(Èý)-----Éè¼ÆÄ£Ê½Ö®OBSERVER(¹Û²ìÕß)ģʽ

[Ô­´´]IssueVision ѧϰ±Ê¼Ç(Èý)-----Éè¼ÆÄ£Ê½Ö®OBSERVER(¹Û²ìÕß)ģʽ

2005-01-09 20:48:49  ×÷Õߣºyellowwee  À´Ô´£º»¥ÁªÍø  ä¯ÀÀ´ÎÊý£º2  ÎÄ×Ö´óС£º¡¾´ó¡¿¡¾ÖС¿¡¾Ð¡¡¿
¼ò½é£º    Õâ´ÎÎÒÃÇÀ´¿´¿´IssueVisionÖеĶÔÉè¼ÆÄ£Ê½µÄÓ¦ÓÃ,IssueVisionÖ÷ҪʹÓÃÁËOBSERVER(¹Û²ìÕß)ģʽºÍCOMMAND(ÃüÁî)ģʽ.½ñÌì¾ÍÀ´¿´¿´OBSERVER(¹Û²ìÕß)ģʽÔÚIssueVisionÖеÄÓ¦ÓÃ,ËüÔÚIssueVisionÖÐ...

Õâ´ÎÎÒÃÇÀ´¿´¿´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.

ÔðÈα༭£ºadmin
±¾ÎÄÒýÓõØÖ·£º http://www.3pcode.com/net/2005/01/31438.htm
Ïà¹ØÎÄÕÂ