發佈者訂閱模式/客戶端模式 對象與對象之間不可以直接調用其成員。如果直接調用其他對象的成員那麼就是一個緊耦合。 1. 1.刪除系統為我們準備的窗體。創建一個窗體應用程式 2.創建兩個窗體對象,一個父窗體一個子窗體 3.在Program程式中修改程式啟動窗體為父窗體 2. 1.為我們的兩個窗體添加同樣 ...
發佈者訂閱模式/客戶端模式
對象與對象之間不可以直接調用其成員。如果直接調用其他對象的成員那麼就是一個緊耦合。
--------1.
1.刪除系統為我們準備的窗體。創建一個窗體應用程式
2.創建兩個窗體對象,一個父窗體一個子窗體
3.在Program程式中修改程式啟動窗體為父窗體
--------2.
1.為我們的兩個窗體添加同樣的控制項
2.空間名稱相同
--------3.
打開父窗體的代碼
public ChildFrm ChildFrm { get; set; }//父視窗屬性 private void ParentFrm_Load(object sender, EventArgs e) { this.ChildFrm = new ChildFrm(); ChildFrm.Show(); }
--------4.
我們在這裡添加的代碼作用在於:
添加了一個委托為我們對象與對象之間的解耦而存在。
我們在一個對象中我們需要儘量的避免對像與對象之間的耦合。該委托為下文做準備
public Action<TextBox> SendToChild { get; set; }//委托{可重用性} public ChildFrm ChildFrm { get; set; }//父視窗屬性 private void ParentFrm_Load(object sender, EventArgs e) { this.ChildFrm = new ChildFrm(); SendToChild += ChildFrm.TestString;//多播委托,此委托鏈接一個方法,方法會轉換為委托實例。 ChildFrm.ObjectToSend(this); ChildFrm.Show(); }
--------5.
創建了一個工廠方法,該方法我們用來檢查傳遞進來的參數是否有錯誤的存在
public void TestString(TextBox x) {//根據外面傳來的值我們決定是否操作。 this.txtMsg.Text = x.Text; }
--------6.
我們在子窗體中聲明瞭一個方法,該方法只處理傳遞進來的一個參數,與外部對象實現了一種解耦
public static class Control { public static void ShowChildSendControl<T>(Action<T> actio, T x) {//工廠方法,檢查是否曾在錯誤 try { if (actio != null || x != null) actio.Invoke(x); return; } catch { Console.WriteLine("出現異常"); } } }
--------7.
添加了一個觸發按鈕的事件,該事件觸發時內部會調用我們的委托,該委托已經指向了一個方法,這個委托作為工廠方法的一個參數傳遞,目的在於我們在工廠方法內進行檢查,提高了代碼的復用性。
private void BtnSendMsg_Click(object sender, EventArgs e) {//父視窗像別的視窗傳值 Control.ShowChildSendControl(this.SendToChild, this.txtMsg); this.txtMsg.Clear(); }