文章出處

需求

  • 主窗體的文本框內容發生改變的時候,多個子窗體的文本框也發生改變。

中介設計模式

實現

  • 當主窗體的文本框內容發生改變的時候,通過接口向所有實現這個接口的窗體發送一條消息(執行接口中的方法),從而實現同步。

主窗體代碼:

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;
        }
    }
  • 注釋掉的部分就是用事件實現,代碼和委托差不多,區別在于事件更安全,因為事件只能在本類內部調用,而委托可以在其他類中調用。


文章列表




Avast logo

Avast 防毒軟體已檢查此封電子郵件的病毒。
www.avast.com


arrow
arrow
    全站熱搜
    創作者介紹
    創作者 大師兄 的頭像
    大師兄

    IT工程師數位筆記本

    大師兄 發表在 痞客邦 留言(0) 人氣()