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 _04PublishPatten { public partial class MainFrm : Form { public ChildFrm1 ChildFrm1 { get; set; } public MainFrm() { InitializeComponent(); } private void btnOpenFrms_Click(object sender, EventArgs e) { ChildFrm1 frm1 =new ChildFrm1(); this.ChildFrm1 = frm1; frm1.Show(); ChildFrm2 frm2 = new ChildFrm2(); //第一种:用接口的形式注册 观察者。 frm1.MessageOnList.Add(frm2);//把观察者放到 观察者的集合中。 //第二种:用户委托的形式注册观察者 //观察者的 方法注册到 form1窗体的委托中去。 //frm1.SendMsgDelInstance += frm2.SetMsgText; //第三种:事件的形式注册观察者。 frm1.SendMsgDelEvent += frm2.SetMsgTextEvent; frm2.Show(); ChildFrm3 frm3 = new ChildFrm3(); //frm1.MessageOnList.Add(frm3); frm1.SendMsgDelInstance += frm3.SetMsgText; frm1.SendMsgDelEvent += frm3.SetMsgTextEvent; frm3.Show(); } private void button1_Click(object sender, EventArgs e) { this.ChildFrm1.SendMsgDelInstance("ssssss"); //this.ChildFrm1.SendMsgDelEvent("sssss"); } } } using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace _04PublishPatten { public interface IMessageON { void RecieveMsg(string str); } } 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 _04PublishPatten { public partial class ChildFrm3 : Form,IMessageON { public ChildFrm3() { InitializeComponent(); } #region 接口实现观察者模式的方法 public void RecieveMsg(string str) { this.txtMsg.Text = str + " " + DateTime.Now.ToString(); } #endregion #region 委托实现的观察者的方法 public void SetMsgText(string str) { this.txtMsg.Text ="委托:"+ str; } #endregion #region 事件使用的方法 public void SetMsgTextEvent(string str) { this.txtMsg.Text = " 事件:" + str; } #endregion } } 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 _04PublishPatten { public partial class ChildFrm2 : Form,IMessageON { public ChildFrm2() { InitializeComponent(); } #region 接口实现观察者模式的方法 public void RecieveMsg(string str) { this.txtMessage.Text = str + " " + DateTime.Now.ToString(); } #endregion #region 委托使用的方法 public void SetMsgText(string str) { this.txtMessage.Text = " 委托:" + str; } #endregion #region 事件使用的方法 public void SetMsgTextEvent(string str) { this.txtMessage.Text = " 事件:" + str; } #endregion } } 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 _04PublishPatten { public delegate void SendMsgDel(string strMsg); public partial class ChildFrm1 : Form { public ChildFrm1() { InitializeComponent(); MessageOnList = new List<IMessageON>(); } #region 委托实现观察者模式 public SendMsgDel SendMsgDelInstance { get; set; } private void btnDelSendMsg_Click(object sender, EventArgs e) { SendMsgDelInstance(DateTime.Now.ToString()); } #endregion #region 用事件实现观察者模式 public event SendMsgDel SendMsgDelEvent; private void btnEvent_Click(object sender, EventArgs e) { SendMsgDelEvent(DateTime.Now.ToString() + " ---"); } #endregion #region C#代码实现观察者模式 //这个集合放我们的观察者。 public List<IMessageON> MessageOnList { get; set; } private void btnMessage_Click(object sender, EventArgs e) { foreach (var messageOn in MessageOnList) { messageOn.RecieveMsg("------"); } } #endregion } }