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

pic11.JPG 介绍 在开发应用程序时,我确信您必须处理多个对象。如果它们必须与相同的源数据交互,我认为您必须找到一种方法,通过数据的更改来更新它们。观察者模式是可以用于此解决方案的关键! 背景 我搜索了这个网站,发现了一些关于观察者模式的文章。我也读了一些关于事件和委派的文章。我想向您——新开发人员——展示一种以最容易理解、最快的方式实现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

原文地址:https://www.cnblogs.com/Dincat/p/13473251.html