介绍 在开发应用程序时,我确信您必须处理多个对象。如果它们必须与相同的源数据交互,我认为您必须找到一种方法,通过数据的更改来更新它们。观察者模式是可以用于此解决方案的关键! 背景 我搜索了这个网站,发现了一些关于观察者模式的文章。我也读了一些关于事件和委派的文章。我想向您——新开发人员——展示一种以最容易理解、最快的方式实现Observer模式的方法。 现在,让我们开始吧! 使用的代码 我使用。net Framework 2.0中的c#语言在Winforms中创建了一个示例。 我有两种形式:Form2和Form3 在form2中,有3个单选按钮,一个标签和一个按钮。如果您选中单选按钮,您将看到标签的前色将随单选按钮的名称而改变。这很简单,不是吗?当您点击按钮打开子窗体时,Form3将显示!如果你再次检查单选按钮,旁边的标签的前色改变,你会看到文本框的背景色在Form3也将改变!就是这样! 我有两个对象在这个解决方案: 主题:是父母!创建客户机时,必须向此主题注册客户机。当某些内容发生更改时,主题将通知它所管理的所有客户机对其进行更新。观察者:它是一个客户。当它诞生时,它必须在主题上注册,如果有什么变化,就等待更新。 Subject对象 首先,我创建了一个委托和一个事件,当某些事情发生变化时,让它“活跃”起来! 隐藏,复制Code
private delegate void NotifyHandler(string _color); private event NotifyHandler NotifyEvent;
我还创建了ArrayList名称arrObs管理所有客户端对象时,它注册到主题对象。 隐藏,复制Code
ArrayList arrObs = new ArrayList();
有关主题的详细资料如下: 隐藏,收缩,复制Code
public class Subject { ArrayList arrObs = new ArrayList(); private delegate void NotifyHandler(string _color); private event NotifyHandler NotifyEvent; public Subject() { this.NotifyEvent += new NotifyHandler(Notify); } public void UpdateClient(string _color) { OnNotify(_color); } private void OnNotify(string _color) { if (NotifyEvent != null) { NotifyEvent(_color); } } private void Notify(string _color) { for (int i = 0; i < arrObs.Count; i++) { Observer obs = (Observer)arrObs[i]; obs.Update(_color); } } public void RegisterClient(Observer obs) { arrObs.Add(obs); } }
您将看到,在创建主题时,它将使用Notify方法注册NotifyEvent。在Notify()中,它将_color字符串以arrob的形式传递给所有客户机。客户端会调用Update方法来更新颜色。 现在,让我们看看客户机对象名称观察者! 观察器对象 和主题对象一样,我将定义一个委托和一个事件,当主题通知他们时,它是活的! 隐藏,复制Code
private delegate void ColorEventHandler(string _color); private event ColorEventHandler ColorChangedEvent;
像subject一样,当subject通知到observer(在上面的更新方法中),ColorChangedEvent将被触发并调用ColorEventHander来传递_color字符串给Update ! 在这个解决方案中,我想更新Form3的背景颜色。因此,这个观察者对象将在form3中创建,并将textbox对象传递给构造函数中的观察者: 隐藏,复制Code
private TextBox txt; public Observer(TextBox _txt) { this.ColorChangedEvent += new ColorEventHandler(Observer_ColorChangedEvent); this.txt = _txt; }
观察者对象的详细信息如下: 隐藏,收缩,复制Code
public class Observer { private delegate void ColorEventHandler(string _color); private event ColorEventHandler ColorChangedEvent; private TextBox txt; public Observer(TextBox _txt) { this.ColorChangedEvent += new ColorEventHandler(Observer_ColorChangedEvent); this.txt = _txt; } private void OnChange(string _color) { if (ColorChangedEvent != null) { ColorChangedEvent(_color); } } public void Update(string _color) { OnChange(_color); } private void Observer_ColorChangedEvent(string _color) { switch (_color) { case "RED": txt.BackColor = Color.Red; break; case "BLUE": txt.BackColor = Color.Blue; break; case "GREEN": txt.BackColor = Color.Green; break; default: txt.BackColor = Color.Gray; break; } } }
Form2 当单选按钮被选中时,它改变了!它将调用Subject对象来更新其客户端。 隐藏,复制Code
private void rdRed_CheckedChanged(object sender, EventArgs e) { if (rdRed.Checked) { objSub.UpdateClient("RED"); lblText.ForeColor = Color.Red; } } private void rdGreen_CheckedChanged(object sender, EventArgs e) { if (rdGreen.Checked) { objSub.UpdateClient("GREEN"); lblText.ForeColor = Color.Green; } } private void rdBlue_CheckedChanged(object sender, EventArgs e) { if (rdBlue.Checked) { objSub.UpdateClient("BLUE"); lblText.ForeColor = Color.Blue; } }
当你点击按钮创建并打开Form3时,会有一个主题对象名称objSub在form中创建并通过构造函数传递给Form3: 隐藏,复制Code
private Subject objSub; private Form3 frm; public Form2() { InitializeComponent(); objSub = new Subject(); } private void btnOpen_Click(object sender, EventArgs e) { frm = new Form3(objSub); frm.Show(); }
对此 只创建一个新的观察者对象并将其注册到objSub中 隐藏,复制Code
public Form3(Subject _objSub) { InitializeComponent(); objSub = _objSub; obs = new Observer(this.textBox1); objSub.RegisterClient(obs); }
这是所有!当您单击单选按钮时,它将调用主题以在其arraylist中更新客户机。客户端将被通知,并将更新文本框的背景色通过主题。 的兴趣点 在一个简单的例子中实现观察者模式是非常紧凑的!希望你能从这个小例子中理解并学会如何解决你的问题! 请随时联系我! 姓名:Nguyen Anh Vu(先生)电子邮件:vuna209@gmail.com手机:+84984886940地址:越南河内广中53号7楼。 本文转载于:http://www.diyabc.com/frontweb/news10770.html