实现观察者模式在一个非常简单的例子

下载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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值