说明 :观察者模式又叫发布-订阅模式,其中又涉及到中介者模式

1 结构

2 创建Main窗体(中介者),ChildForm1(发布者),ChildForm2(订阅者),ChildForm3(订阅者),

  2.1 ChildForm1中添加按钮,当按钮被点击是ChildForm2(订阅者),ChildForm3(订阅者),的文本框汇中获取信息

  2.2 定义接口

  public interface IMessageOn
     {
         void RecieveMsg(string str);
     }

  2.3 在发布者ChildForm1中创建MessageOnList集合

  2.4 订阅者ChildForm2,ChildForm3中实现接口

  public void RecieveMsg(string str)
        {
            this.txtGetTime.Text = str;
        }

  2.5 中介者Main把 订阅者放入到发布者的MessageONList集合中

  ChildForm2 frm2 = new ChildForm2();
            //2把订阅者放入到发布者的MessageONList集合中
            frm1.MessageOnList.Add(frm2);
            //3显示窗体
            frm2.Show();

  2.6 遍历集合,通知所有的观察者

   foreach (var MessageOn in MessageOnList)
            {
                MessageOn.RecieveMsg(txtSendMsg.Text);
            }

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;namespace 中介者_订阅者
{public partial class Main : Form{public Main(){InitializeComponent();}private void btnOpenForm_Click(object sender, EventArgs e){//1创建窗体ChildForm1 frm1 = new ChildForm1();frm1.Show();ChildForm2 frm2 = new ChildForm2(); //2把订阅者放入到发布者的MessageONList集合中
            frm1.MessageOnList.Add(frm2);//3显示窗体
            frm2.Show();ChildForm3 frm3 = new ChildForm3();frm1.MessageOnList.Add(frm3);frm3.Show();}}
}

Main

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;namespace 中介者_订阅者
{public interface IMessageOn{void RecieveMsg(string str);}
}

IMessageOn

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;namespace 中介者_订阅者
{public partial class ChildForm1 : Form{public ChildForm1(){InitializeComponent();MessageOnList = new List<IMessageOn>();}public List<IMessageOn> MessageOnList { set; get; }private void btnSendTime_Click(object sender, EventArgs e){foreach (var MessageOn in MessageOnList){MessageOn.RecieveMsg(txtSendMsg.Text);}}}
}

ChildForm1

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;namespace 中介者_订阅者
{public partial class ChildForm2 : Form,IMessageOn{public ChildForm2(){InitializeComponent();}public void RecieveMsg(string str){this.txtGetTime.Text = str;}}
}

ChildForm2

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;namespace 中介者_订阅者
{public partial class ChildForm3 : Form,IMessageOn{public ChildForm3(){InitializeComponent();}public void RecieveMsg(string str){this.txtGetTime.Text = str;}
}
}

ChildForm3

通过中介者,将发布者和订阅者实现了解耦

3 通过委托实现

3.1 在ChildForm1中声明委托类型

public delegate void SendMsgDel(string sendMsg);

3.2 在ChildForm1中定义委托实例

   //02-02定义委托实例
        public SendMsgDel SendMsgDelInstance { set; get; }

3.3   在ChildForm2中定义委托实现方法
        public void RecieveMsgByDel(string str)
        {
            this.txtGetTime.Text = str;
        }

3.4 Main中将观察者的方法注册到ChildForm1中的委托中去

frm1.SendMsgDelInstance += frm2.RecieveMsgByDel;
 3.5 单击按钮触发事件

private void btnDelegate_Click(object sender, EventArgs e)
        {
            SendMsgDelInstance(txtSendMsg.Text);
        }

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;namespace 中介者_订阅者
{public partial class Main : Form{public Main(){InitializeComponent();}private void btnOpenForm_Click(object sender, EventArgs e){//1创建窗体ChildForm1 frm1 = new ChildForm1();frm1.Show();ChildForm2 frm2 = new ChildForm2(); //2把订阅者放入到发布者的MessageONList集合中
            frm1.MessageOnList.Add(frm2);frm1.SendMsgDelInstance += frm2.RecieveMsgByDel;//3显示窗体
            frm2.Show();ChildForm3 frm3 = new ChildForm3();frm1.MessageOnList.Add(frm3);//2-2将观察者的方法注册到委托中去frm1.SendMsgDelInstance += frm3.RecieveMsgByDel;frm3.Show();}}
}

Main

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;namespace 中介者_订阅者
{public interface IMessageOn{void RecieveMsg(string str);}
}

IMessageOn

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;namespace 中介者_订阅者
{//02-01定义委托public delegate void SendMsgDel(string sendMsg);public partial class ChildForm1 : Form{public ChildForm1(){InitializeComponent();MessageOnList = new List<IMessageOn>();}#region 01通过发布者模式实现public List<IMessageOn> MessageOnList { set; get; }private void btnSendTime_Click(object sender, EventArgs e){foreach (var MessageOn in MessageOnList){MessageOn.RecieveMsg(txtSendMsg.Text);}} #endregion#region 02通过委托实现//02-02定义委托实例public SendMsgDel SendMsgDelInstance { set; get; }private void btnDelegate_Click(object sender, EventArgs e){SendMsgDelInstance(txtSendMsg.Text);} #endregion}
}

ChildForm1

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;namespace 中介者_订阅者
{public partial class ChildForm2 : Form,IMessageOn{public ChildForm2(){InitializeComponent();}#region 01接口实现发布者模式 方法public void RecieveMsg(string str){this.txtGetTime.Text = str;} #endregion#region 02委托实现方法public void RecieveMsgByDel(string str){this.txtGetTime.Text = str;}#endregion}
}

ChildForm2

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;namespace 中介者_订阅者
{public partial class ChildForm3 : Form,IMessageOn{public ChildForm3(){InitializeComponent();}#region 01接口实现发布者模式 方法public void RecieveMsg(string str){this.txtGetTime.Text = str;}#endregion#region 02委托实现方法public void RecieveMsgByDel(string str){this.txtGetTime.Text = str;}#endregion
}
}

ChildForm3

但是,使用委托有一缺陷==>不安全,
例如,在Main中创建完窗体后直接加一句

frm1.SendMsgDelInstance("委托实现不安全");

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;namespace 中介者_订阅者
{public partial class Main : Form{public Main(){InitializeComponent();}private void btnOpenForm_Click(object sender, EventArgs e){//1创建窗体ChildForm1 frm1 = new ChildForm1();frm1.Show();ChildForm2 frm2 = new ChildForm2(); //2-1把订阅者放入到发布者的MessageONList集合中---接口形式注册
            frm1.MessageOnList.Add(frm2);frm1.SendMsgDelInstance += frm2.RecieveMsgByDel;frm1.SendMsgDelEven += frm2.RecieveMsgByEvent;//3显示窗体
            frm2.Show();ChildForm3 frm3 = new ChildForm3();frm1.MessageOnList.Add(frm3);//2-2将观察者的方法注册到委托中去----委托形式注册frm1.SendMsgDelInstance += frm3.RecieveMsgByDel;//2-3将观察者的方法注册到事件中去----事件形式注册frm1.SendMsgDelEven += frm3.RecieveMsgByEvent;frm3.Show();frm1.SendMsgDelInstance("委托实现不安全");//frm1.SendMsgDelEven("事件事件安全");
        }}
}

View Code

4通过事件实现

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;namespace 中介者_订阅者
{public partial class Main : Form{public Main(){InitializeComponent();}private void btnOpenForm_Click(object sender, EventArgs e){//1创建窗体ChildForm1 frm1 = new ChildForm1();frm1.Show();ChildForm2 frm2 = new ChildForm2(); //2-1把订阅者放入到发布者的MessageONList集合中---接口形式注册
            frm1.MessageOnList.Add(frm2);frm1.SendMsgDelInstance += frm2.RecieveMsgByDel;frm1.SendMsgDelEven += frm2.RecieveMsgByEvent;//3显示窗体
            frm2.Show();ChildForm3 frm3 = new ChildForm3();frm1.MessageOnList.Add(frm3);//2-2将观察者的方法注册到委托中去----委托形式注册frm1.SendMsgDelInstance += frm3.RecieveMsgByDel;//2-3将观察者的方法注册到事件中去----事件形式注册frm1.SendMsgDelEven += frm3.RecieveMsgByEvent;frm3.Show();frm1.SendMsgDelInstance("委托实现不安全");//frm1.SendMsgDelEven("事件事件安全");
        }}
}

Main

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;namespace 中介者_订阅者
{public interface IMessageOn{void RecieveMsg(string str);}
}

IMessageOn

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;namespace 中介者_订阅者
{//02-01定义委托public delegate void SendMsgDel(string sendMsg);public partial class ChildForm1 : Form{public ChildForm1(){InitializeComponent();MessageOnList = new List<IMessageOn>();}#region 01通过发布者模式实现public List<IMessageOn> MessageOnList { set; get; }private void btnSendTime_Click(object sender, EventArgs e){foreach (var MessageOn in MessageOnList){MessageOn.RecieveMsg(txtSendMsg.Text);}} #endregion#region 02通过委托实现//02-02定义委托实例public SendMsgDel SendMsgDelInstance { set; get; }private void btnDelegate_Click(object sender, EventArgs e){SendMsgDelInstance(txtSendMsg.Text);} #endregion#region 03事件实现public event SendMsgDel SendMsgDelEven;private void btnEvent_Click(object sender, EventArgs e){if (SendMsgDelEven!=null){SendMsgDelEven(txtSendMsg.Text);}}#endregion}
}

ChildForm1

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;namespace 中介者_订阅者
{public partial class ChildForm2 : Form,IMessageOn{public ChildForm2(){InitializeComponent();}#region 01接口实现发布者模式 方法public void RecieveMsg(string str){this.txtGetTime.Text = str;} #endregion#region 02委托实现方法public void RecieveMsgByDel(string str){this.txtGetTime.Text = str;}#endregion#region 03事件实现方法public void RecieveMsgByEvent(string str){this.txtGetTime.Text = str;}#endregion}
}

ChildForm2

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;namespace 中介者_订阅者
{public partial class ChildForm3 : Form,IMessageOn{public ChildForm3(){InitializeComponent();}#region 01接口实现发布者模式 方法public void RecieveMsg(string str){this.txtGetTime.Text = str;}#endregion#region 02委托实现方法public void RecieveMsgByDel(string str){this.txtGetTime.Text = str;}#endregion#region 03事件实现方法public void RecieveMsgByEvent(string str){this.txtGetTime.Text = str;}#endregion
}
}

View Code

转载于:https://www.cnblogs.com/YK2012/p/6806842.html

步步为营-44-窗体之间传值--观察者模式相关推荐

  1. 窗体之间传值的暴力方法

    窗体之间传值可以使用观察者模式,但是如果设置一个static(静态)变量,好像更简单.对于小型程序感觉是可用的: 在前一个窗体上: public static string x: //试验窗体切换的代 ...

  2. pyqt5窗口之间传递信号_pyQT5 实现窗体之间传值的示例

    准备 一个MainWindow和一个WidgetForm,总代码如下 # -*- coding: utf-8 -*- from PyQt5 import QtWidgets from main_win ...

  3. C#使用事件方式Winform窗体之间传值

    [摘自:http://www.cnblogs.com/codeToUp/p/5371062.html] 工程的源代码地址:https://github.com/yes-or-no/WinFormTra ...

  4. windows form (窗体) 之间传值

    在windows form之间传值,我总结了有四个方法:全局变量.属性.窗体构造函数和delegate. 第一个全局变量: 这个最简单,只要把变量描述成static就可以了,在form2中直接引用fo ...

  5. WinForm窗体之间传值

    当程序需要将一个窗体中的一些信息传给另一个窗体并让其使用时,就需要用到这个知识点 方法一:通过接受参数的窗体的构造函数传值 例:现有Form1和Form2两个窗体,二者都包含一个文本框,Form1还包 ...

  6. c#父窗体子窗体之间传值

    c#窗体传值 1. 父窗体向子窗体传值 父窗体Form1程序 //使其成为主窗体Form1的一个属性,private string text;public string Text{get { retu ...

  7. c# 不同窗体之间传值和调用

    1.子窗体事件刷新父窗体界面值 子窗体定义委托和事件 //声明一个委托public delegate void DisplayUpdateDelegate(string str);//声明事件publ ...

  8. 关于主窗体与子窗体之间的通信以及面向对象思想的一些应用

    该写几篇文章啦~ 最近在搞winForm,开始的时候遇到点问题.其实也不算什么大问题,归结起来还是主窗体与子窗体之间传值.通信的问题: 这个问题在网上的解决方案有很多,一搜一大堆,比如将主窗体自身作为 ...

  9. java swing 传值_java swing 窗体之间怎么传值?

    展开全部 传递一个对象过去32313133353236313431303231363533e58685e5aeb931333332623366:package org.somken; import j ...

最新文章

  1. 数据可视化完美指南-R-Python
  2. windows下redis 和 hiredis的编译与使用
  3. python-map函数
  4. 锤子剪刀布 (20)
  5. python代码打开可执行文件_将自己的Python代码打包成exe文件(更换设备可运行的)...
  6. Step by Step to download a material from ERP via request download
  7. html 图片 保持长宽比,实现图片在页面中宽高一直保持16:9比例的方法
  8. 使用Spring Boot Actuator、Jolokia和Grafana实现准实时监控
  9. JavaScript对象中的this属性
  10. 一篇文章带你快速入门JavaScript(自学者福利)
  11. 彻底与高通谈崩?苹果被爆计划自研5G调制解调器
  12. Julia的学习资料从哪里找?
  13. balenaEtcher-1.5.70可能是最好用的镜像写U盘工具 img to usb dmg to usb支持多种格式内附截图介绍多平台均有
  14. digester_Apache Digester示例–轻松配置
  15. 计算机双系统,细说如何给电脑安装双系统
  16. FAN73893MX 350mA-650mA 高压600V 用于高压、高速驱动 MOSFET和IGBT 三相半桥栅极驱动 IC
  17. Matlab——图形绘制——三维立体图形 剔透玲珑球 动态图——彗星状轨迹图
  18. win10安装vivado + vitis 2019.2 教程
  19. 大数据技术原理与应用(7-11)-TYUT
  20. 我和java这两年--青石桥

热门文章

  1. [转载] CSS模块化【封装-继承-多态】
  2. C++用数组和链表分别实现Queue
  3. latex 插图解释_大O符号-只需插图和视频即可解释
  4. Spring Cloud应用开发(四:服务容错保护)
  5. java登陆界面连接数据库_java 登陆界面怎么写,连接数据库后
  6. Servlert接口的doGet()、doPst()方法
  7. mysql 触发器死循环_请教如何避免该条触发器的死循环
  8. PRD 的编写和修改注意事项
  9. 浅谈同一家公司多个系统,共用登录用户名和密码
  10. react es6+ 代码优化之路-1