观察者模式的应用:Winform窗体之间传值
2021-01-18 03:15
标签:nta class reg summary 避免 inf ica head pat 观察者模式的概念: 定义了对象之间的一对多依赖,这样一来,当一个对象改变状态时,它的所有依赖者都会收到通知并更新。 今天我们就学着用一下这个观察者模式,先想象下这个场景:当一个窗体(主窗体)内的值发生变化时,另外几个窗体内的值也会发生相应的变化。这个最简单的实现方式是,在子窗体类内创建一个公共方法,在主窗体内创建子窗体的实例。当值发生变化时调用子窗体的公共方法。还有一种简单方法是用静态属性,相当于全局变量,这个只能针对小型应用。第一种有一个缺点,当增加子窗体时,我们需要更改主窗体类的代码。无法实现动态地增加删除对子窗体类中值的更新。这时可以引入观察者模式。 修改FrmMain类,使其实现ISubject接口,再给文本框增加change事件,代码如下: 子窗体类(订阅者)的代码如下: 上面可以看到FrmMain又依赖了FrmSub1和FrmSub2,其实这是需要另一个方法Show()。不过为表现出高层不依赖底层,我们改掉代码,在NotifyObservers(bool isShown)方法中加入对子窗体是否show的判断,从而实现了避免FrmMain依赖FrmSub1,FrmSub2 子窗体类的代码: 完整源代码参考:https://gitee.com/Alexander360/ProDotnetDesignPatternFramework45 观察者模式的应用:Winform窗体之间传值 标签:nta class reg summary 避免 inf ica head pat 原文地址:https://www.cnblogs.com/AlexanderZhao/p/12184407.html观察者模式的应用:Winform窗体传值
我们先创建一个winform项目,添加FrmMain,FrmSub1,FrmSub2三个窗体,每个窗体都添加一个textbox文本框,实现当主窗体中的文本框值发生变化时,其他两个子窗体的值也会发生相应的变化。这里我们参考《Head First设计模式》,先设计发布者和订阅者(这里我感觉还是叫比较顺口)。代码如下: public interface ISubject
{
///
public partial class FrmMain : Form, ISubject
{
private string Message { get; set; }
private List
public partial class FrmSub1 : Form,IObserver
{
public FrmSub1(ISubject subject)
{
InitializeComponent();
//注册
subject.RegisterObserver(this);
}
//当发布者事件发生时,订阅者需要执行的方法
public void Update(string message,bool isShown)
{
txtSub.Text = message;
}
}
FrmMain类的代码:public partial class FrmMain : Form, ISubject
{
private string Message { get; set; }
private List
public partial class FrmSub1 : Form,IObserver
{
public FrmSub1(ISubject subject)
{
InitializeComponent();
subject.RegisterObserver(this);
}
//这里对Update做了改变,isShown为true,表示事件触发时子窗体已经显示
public void Update(string message,bool isShown)
{
if (isShown)
{
txtSub.Text = message;
}
else
{
this.Show();
}
}
}
[STAThread]
static void Main()
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
FrmMain frmMain = new FrmMain();
FrmSub1 frmSub1 = new FrmSub1(frmMain);
FrmSub2 frmSub2 = new FrmSub2(frmMain);
Application.Run(frmMain);
}
下一篇:1282. 用户分组(贪心算法)
文章标题:观察者模式的应用:Winform窗体之间传值
文章链接:http://soscw.com/index.php/essay/43494.html