zoukankan      html  css  js  c++  java
  • 实现观察者模式在一个非常简单的例子

    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

  • 相关阅读:
    【转】BP神经网络
    【转】Matlab的regionprops详解
    【转】本人常用资源整理(ing...)
    【转】LDA-linear discriminant analysis
    [转]推荐几个机器学习算法及应用领域相关的中国大牛:
    【转】机器学习资料推荐
    《转贴》机器学习 机器视觉 图像处理 牛人牛站
    [转]LLE
    UVA10651
    UVA10051
  • 原文地址:https://www.cnblogs.com/Dincat/p/13473251.html
Copyright © 2011-2022 走看看