下载source - 34.91 KB
介绍
在开发应用程序时,我确信您必须处理多个对象。如果它们必须与相同的源数据交互,我认为您必须找到一种方法,通过数据的更改来更新它们。观察者模式是可以用于此解决方案的关键!
背景
我搜索了这个网站,发现了一些关于观察者模式的文章。我也读了一些关于事件和委派的文章。我想向您——新开发人员——展示一种以最容易理解、最快的方式实现Observer模式的方法。
现在,让我们开始吧!
使用的代码
我使用。net Framework 2.0中的c#语言在Winforms中创建了一个示例。
我有两种形式:Form2和Form3
在form2中,有3个单选按钮,一个标签和一个按钮。如果您选中单选按钮,您将看到标签的前色将随单选按钮的名称而改变。这很简单,不是吗?当您点击按钮打开子窗体时,Form3将显示!如果你再次检查单选按钮,旁边的标签的前色改变,你会看到文本框的背景色在Form3也将改变!就是这样!
我有两个对象在这个解决方案:
主题:是父母!创建客户机时,必须向此主题注册客户机。当某些内容发生更改时,主题将通知它所管理的所有客户机对其进行更新。观察者:它是一个客户。当它诞生时,它必须在主题上注册,如果有什么变化,就等待更新。
Subject对象
首先,我创建了一个委托和一个事件,当某些事情发生变化时,让它“活跃”起来!
隐藏,复制Codeprivate delegate void NotifyHandler(string _color);
private event NotifyHandler NotifyEvent;
我还创建了ArrayList名称arrObs管理所有客户端对象时,它注册到主题对象。
隐藏,复制CodeArrayList arrObs = new ArrayList();
有关主题的详细资料如下:
隐藏,收缩,复制Codepublic 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方法来更新颜色。
现在,让我们看看客户机对象名称观察者!
观察器对象
和主题对象一样,我将定义一个委托和一个事件,当主题通知他们时,它是活的!
隐藏,复制Codeprivate delegate void ColorEventHandler(string _color);
private event ColorEventHandler ColorChangedEvent;
像subject一样,当subject通知到observer(在上面的更新方法中),ColorChangedEvent将被触发并调用ColorEventHander来传递_color字符串给Update !
在这个解决方案中,我想更新Form3的背景颜色。因此,这个观察者对象将在form3中创建,并将textbox对象传递给构造函数中的观察者:
隐藏,复制Codeprivate TextBox txt;
public Observer(TextBox _txt)
{
this.ColorChangedEvent += new ColorEventHandler(Observer_ColorChangedEvent);
this.txt = _txt;
}
观察者对象的详细信息如下:
隐藏,收缩,复制Codepublic 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对象来更新其客户端。
隐藏,复制Codeprivate 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:
隐藏,复制Codeprivate 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中
隐藏,复制Codepublic 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