需求
- 主窗体的文本框内容发生改变的时候,多个子窗体的文本框也发生改变。
中介设计模式
实现
- 当主窗体的文本框内容发生改变的时候,通过接口向所有实现这个接口的窗体发送一条消息(执行接口中的方法),从而实现同步。
主窗体代码:
public partial class parentFrm : Form
{
private List<IMessage> list = new List<IMessage>();
public parentFrm()
{
InitializeComponent();
}
public void setText(string text)
{
this.tb.Text = text;
}
private void button1_Click(object sender, EventArgs e)
{
ChildFrm1 frm = new ChildFrm1();
list.Add(frm);
frm.Show();
ChildFrm2 frm2 = new ChildFrm2();
list.Add(frm2);
frm2.Show();
ChildFrm3 frm3 = new ChildFrm3();
list.Add(frm3);
frm3.Show();
}
private void tb_TextChanged(object sender, EventArgs e)
{
foreach (IMessage Msg in list)
{
Msg.onMessage(this.tb.Text);
}
}
}
子窗体(由于子窗体基本上一样,在这里就只写一个)
public partial class ChildFrm1 : Form,IMessage
{
public ChildFrm1()
{
InitializeComponent();
}
public void onMessage(string str)
{
this.textBox1.Text = str;
}
}
接口
interface IMessage
{
void onMessage(string str);
}
- 主窗体将所有需要同步文本内容的子窗体都添加到一个IMessage集合中,然后当主窗体的文本框中内容发生改变的时候,遍历这个集合,执行onMessage()方法,修改子窗体文本框中的内容。
- IMessage这个接口就是一个中介。
委托设计模式
实现:
- 创建一个接口,接口里面写一个设置文本框内容的方法,然后让子窗体实现这个接口,在主窗体中声明一个委托,这个委托用来装接口中的这个方法,然后实例化这个委托,子窗体创建的时候,把所有子窗体中实现的接口中的方法给委托实例,然后在主文本框发生改变的这个方法中执行这个委托。
代码
public delegate void delSendMessage(string str);
public partial class Form1 : Form
{
//事件
public event delSendMessage sendMessageEvent;
public delSendMessage sendMessage { get; set; }
public Form1()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
ChildFrm1 frm1 = new ChildFrm1();
//this.sendMessageEvent += frm1.setText;
this.sendMessage += frm1.setText;
frm1.Show();
ChildFrm2 frm2 = new ChildFrm2();
//this.sendMessageEvent += frm2.setText;
this.sendMessage += frm2.setText;
frm2.Show();
ChildFrm3 frm3 = new ChildFrm3();
//this.sendMessageEvent += frm3.setText;
this.sendMessage += frm3.setText;
frm3.Show();
}
private void textBox1_TextChanged(object sender, EventArgs e)
{
sendMessage.Invoke(this.textBox1.Text);
//sendMessageEvent(this.textBox1.Text);
}
}
public partial class ChildFrm2 : Form,ISetText
{
public ChildFrm2()
{
InitializeComponent();
}
public void setText(string str)
{
this.textBox1.Text = str;
}
}
- 注释掉的部分就是用事件实现,代码和委托差不多,区别在于事件更安全,因为事件只能在本类内部调用,而委托可以在其他类中调用。