1. 程式人生 > >多播委託與觀察者模式聯合使用,以及委託與事件的區別

多播委託與觀察者模式聯合使用,以及委託與事件的區別

首先我們先看一下多播委託:

使用委託時,首先我們宣告委託,委託語法一共有四種類型,分別時有參,無參,以及有無引數返回值。

1   public class DelegateShow //: System.MulticastDelegate,多播委託
2     {
3         public delegate void NoReturnNoPara();//1 宣告委託  一個沒有方法體的方法,加上delegate關鍵字
4         public delegate void NoReturnWithPara(Student student, int size, string remark);
5 public delegate string WithReturnNoPara(); 6 public delegate Student WithReturnWithPara(string name, int id);
View Code

接下來,我們寫一個無參的方法:

1  private void ShowNothing()
2         {
3             Console.WriteLine("This is ShowNothing");
4         }
View Code

哦,對了,還要在頂類裡面定義下方法,方便後面呼叫:

 public class OtherClass
    {
        public void ShowNothing()
        {
            Console.WriteLine("This is ShowNothing");
        }

        public static void ShowNothingStatic()
        {
            Console.WriteLine("This is ShowNothing");
        }
    }
View Code

好,接下來,我們開始委託例項化,呼叫委託:

 1   OtherClass otherClass = new OtherClass();
 2 
 3                 //多播委託就是一個方法列表  +=在列表尾巴上加方法,   
 4                 //-=就是從尾巴開始匹配,只移除第一個完全吻合方法,如果沒有吻合,不報錯
 5                 NoReturnNoPara method = new NoReturnNoPara(ShowNothing);//放入ShowNothing
 6                 method += otherClass.ShowNothing;//再放入2    
 7                 method += OtherClass.ShowNothingStatic;//再放入3
 8                 method += OtherClass.ShowNothingStatic;//再放入3
 9                 method += OtherClass.ShowNothingStatic;//再放入3
10                 method += () => Console.WriteLine("123456");
11                 method.Invoke();
12 
13                 //method.BeginInvoke(null, null);//多播委託不能直接非同步
14                 foreach (NoReturnNoPara item in method.GetInvocationList())
15                 {
16                     item.BeginInvoke(null, null);
17                 }
18 
19                 Console.WriteLine("***********************************************");
20                 method -= ShowNothing;
21                 method -= otherClass.ShowNothing;//減少2
22                 method -= OtherClass.ShowNothingStatic;//減少3
23                 method -= () => Console.WriteLine("123456");
24                 method.Invoke();
25                 Console.WriteLine("***********************************************");
View Code

說一下:個人覺得多播委託,就是以事件為引數放到多播委託這個列表裡面,放到列表的語法就是+=,從列表移除的方法就是-=,但是多播委託是不支援非同步的,所以這裡我們就要

呼叫一個封裝的引數method.GetInvocationList(),配合BeginInvoke()就可以實現多播委託非同步。

還有一個知識點就是,多播委託為變數配合lambda使用時,多個返回值只能返回最後一個值:

1  WithReturnNoPara method = () => DateTime.Now.ToString();
2                 Console.WriteLine(method.Invoke());
3 
4                 method += () => "1";
5                 method += () => "2";
6                 method += () => "3";
7                 method += () => "4";
8                 method += () => "5";
9                 Console.WriteLine(method.Invoke());//待返回值的多播委託,只能獲得最後一個方法的返回值
View Code

好了,接下來我們說一下觀察者模式,這裡我拷貝了一下觀察者模式具體是一個什麼樣的業務場景。

觀察者模式(Observer)完美的將觀察者和被觀察的物件分離開。舉個例子,使用者介面可以作為一個觀察者,業務資料是被觀察者,使用者介面觀察業務資料的變化,發現數據變化後,就顯示在介面上。面向物件設計的一個原則是:系統中的每個類將重點放在某一個功能上,而不是其他方面。一個物件只做一件事情,並且將他做好。觀察者模式在模組之間劃定了清晰的界限,提高了應用程式的可維護性和重用性。 觀察者設計模式定義了物件間的一種一對多的依賴關係,以便一個物件的狀態發生變化時,所有依賴於它的物件都得到通知並自動重新整理。 額,這個是百度出來的意義,具體我舉一個例子:例子就是貓、狗、小孩、老鼠,由於貓的一個動作發生的一起連鎖反應。 如果單純實現功能,方法有很多,或許我們可以這樣寫:
 1   public class Cat
 2     {
 3         public void Miao()
 4         {
 5             Console.WriteLine("貓 miao了一聲。。。");
 6 
 7 
 8             Dog.Wang();
 9             Mouse.Run();
10             People.Awake();
11             Stealer.Hide();
12             Baby.Cry();
13         }
View Code

這樣確實可以實現功能,但是這樣帶來了很多不好的地方,如果以後我們再增加觀察者或者修改觀察者的動作,都會破壞當前這個方法,也違背了單一職責,耦合比較高,難維護等缺點,這時,就用到了我們委託來解偶啦。

具體來看程式碼:

 1       public delegate void CatMiaoDelegate(); //宣告委託;
 2         public CatMiaoDelegate CatMiaoDelegateHandler;
 3         public void MiaoDelegate()
 4         {
 5             Console.WriteLine("貓 MiaoDelegate了一聲。。。");
 6             if (CatMiaoDelegateHandler != null)
 7             {
 8                 CatMiaoDelegateHandler.Invoke(); //實現委託;
 9             }
10 
11         }
12           
View Code
                Cat cat = new Cat();
                cat.Miao();


                cat.CatMiaoDelegateHandler += Mouse.Run;
                cat.CatMiaoDelegateHandler.Invoke();
                cat.CatMiaoDelegateHandler = null;

                cat.CatMiaoDelegateHandler += Dog.Wang;
                cat.CatMiaoDelegateHandler += People.Awake;
                cat.CatMiaoDelegateHandler += Stealer.Hide;
                cat.CatMiaoDelegateHandler += Baby.Cry;
                cat.CatMiaoDelegateHandler += Brother.Turn;
                cat.MiaoDelegate();//多播委託呼叫實現其他類方法;
View Code

這樣我們就把前面那個高耦合的方法中,得到了解耦的目的,並且在維護和增加其他觀察者時不用再次破壞方法,符合對擴充套件開放  對修改封閉的原則,這樣是極好的。

接下來再說一下委託和事件的區別把:

1、事件是委託的例項,加了一個event的關鍵字
2、委託是一種型別 事件是委託的例項
3、加event關鍵字後,控制了許可權,不讓外部呼叫或者直接賦值

好了,上面個人總結對多播委託與觀察者綜合使用,以及委託與事件之間的區別。可能還有不對的地方,希望大牛多多指導。

相關推薦

委託觀察模式聯合使用以及委託事件區別

首先我們先看一下多播委託: 使用委託時,首先我們宣告委託,委託語法一共有四種類型,分別時有參,無參,以及有無引數返回值。 1 public class DelegateShow //: System.MulticastDelegate,多播委託 2 { 3 public del

中介模式觀察模式

中介者模式 Mediator(中介者)模式是行為模式之一,在Mediator模式中,類之間的互動行為被統一放在Mediator的物件中,物件通過Mediator物件同其他物件互動,Mediator物件起著控制器的作用。   用一箇中介物件來封裝一系列的物件互動,中介者使各物件不需要顯示

設計模式——觀察模式(海姆達爾仙宮人民)

本文首發於cdream的個人部落格,點選獲得更好的閱讀體驗! 歡迎轉載,轉載請註明出處 本文主要對觀察者進行概述講解,並使用觀察者模式來模擬海姆達爾在發現敵人來襲後通知雷神托爾和洛基的過程。 一、概念 定義 觀察者模式也叫作釋出-訂閱模式,也就是事件監聽機制。觀察者模式定義了物件之間

推拉模式觀察模式(未完待續)

推拉模式與觀察者模式 推(push)模式是一種基於客戶器/伺服器機制、由伺服器主動將資訊送到客戶器的技術。在push模式應用中,伺服器把資訊送給客戶器之前,並沒有明顯的客戶請求。push事務由伺服器發起。push模式可以讓資訊主動、快速地尋找使用者/客戶器,資訊的主動性和實

javscript-發布訂閱模式觀察模式

splice reac 解決方法 狀態 square n) 方法 vsc 模式 設計模式”(Design Pattern)是針對編程中經常出現的、具有共性的問題,所提出的解決方法。著名的《設計模式》一書一共提出了23種模式。 發布訂閱模式 它定義了一種對象間一對多的關系

觀察模式、發布訂閱和事件驅動

中間件 說明 發布訂閱 ret dem 天下 參與者 void setname   觀察者模式(有時又被稱為模型(Model)-視圖(View)模式、源-收聽者(Listener)模式或從屬者模式)是軟件設計模式的一種。在此種模式中,一個目標物件管理所有相依於它的觀察者物件

android 頁面訊息傳遞觀察模式處理打造純粹的訊息傳遞。

現實的開發過程中大家都會用到很多頁面與頁面之間的訊息傳遞,方法有很多,觀察者模式,EventBus,廣播,intent,很多很多種方式可以實現。今天我要提一提利用觀察者模式進行頁面之間的訊息傳遞與接收。 首先定義一個用於通知訊息的介面,ObserverListener /

Android---MVP模式介紹以及MVPMVC的區別

(1). MVP模式簡介 相信大家對MVC都是比較熟悉了:M-Model-模型、V-View-檢視、C-Controller-控制器,MVP作為MVC的演化版本,那麼類似的MVP所對應的意義:M-Model-模型、V-View-檢視、P-Presenter-表示器。 從MV

關於單位“緹”“畫素”的轉換以及其他單位(例如:釐米)之間的轉換

【概念】緹(Twips)是用來展示空間或定義在紙張,或其他要列印的或在計算機顯示器上顯示區域上物體的量度。1緹等於1/1440英寸或1/567釐米。也就是說1英寸中有1440緹或1釐米中有567緹。1緹等於傳統列印量度點的二十分之一。1點近似等於1/72英寸。   許多計算

委託繼承 及觀察模式

C#中的委託和事件 注意:文中程式碼在VS2005下通過,由於VS2003(.Net Framework 1.1)不支援隱式的委託變數,所以如果在一個接受委託型別的位置直接賦予方法名,在VS2003下會報錯,解決辦法是顯式的建立一個委託型別的例項(委託變數)。例如:委託型別 委託例項 = ne

Unity之C#——委託事件觀察模式貓和老鼠事例

委託與事件,觀察者模式,貓和老鼠事例     在Unity遊戲開發中,我們經常需要在一個類中,呼叫另一個類中的方法,比如,當玩家進入到某個地方,敵人就開始攻擊玩家。這時就需要利用委託與事件,設計觀察者模式。 此處我們利用貓和老鼠來簡單描述: 程式碼如下: Ca

設計模式觀察模式事件委託

        觀察者模式:                 定義了一種一對多的依賴關係,讓多個觀察者物件同時監聽某個主題物件。這個主題物件在狀態發生變化時,會通知所有觀察者物件,使它們能夠自己更新自己。           觀察者結構模式圖:               

觀察模式-貓捉老鼠(委託事件

貓捉老鼠是一個典型的觀察者模式的實現案例,在其中加入委託與事件的程式實現,將會提高程式碼的一個可讀性,其下是程式碼實現: 建立一個Cat類: using System; using System.

設計思想模式之五觀察模式

per -- 什麽 over out junit 測試類 rem second 一 概述 1.什麽是觀察者模式? 將一個對象視作被觀察者,當它發出某種行為或者發生某種變化時,通知所有依賴它的對象(觀察者),這種設計模式叫做觀察者設計模式。 2.觀察者設

淺談java中內置的觀察模式動態代理的實現

所有 代理 notify play ani effect 一個 indicate protected 一.關於觀察者模式 1.將觀察者與被觀察者分離開來,當被觀察者發生變化時,將通知所有觀察者,觀察者會根據這些變化做出對應的處理。 2.jdk裏已經提供對應的Observer

觀察模式發布訂閱模式區別

發布訂閱 簡單的 veh highlight event 對象 instance post 相對 觀察者模式是軟件設計模式的一種。在此種模式中,一個目標對象管理所有相依於它的觀察者對象,並且在它本身的狀態改變時主動發出通知。這通常透過呼叫各觀察者所提供的方法來實現。此種模式

觀察模式事件委托

implement pat pos status string sub 通知 serve handle 情景 平時很多人都會用新浪微博, 關註女神動態, 女神就是通知者,也叫主題, 而關註女神的這些人,就是觀察者,也叫訂閱者, 既然訂閱了女神的動態, 如果女神有新的動態,

Java事件監聽機制觀察設計模式

idea demo1 script 操作 alt face ner over 方法 一. Java事件監聽機制 1. 事件監聽三要素: 事件源,事件對象,事件監聽器 2. 三要素之間的關系:事件源註冊事件監聽器後,當事件源上發生某個動作時,事件源就會調用事件監聽的一個方法,

觀察模式執行緒執行訂閱事件並順序執行的問題

       對事件釋出訂閱模式中啟動執行緒執行操作,但又要保證執行緒順序執行的一些思考和實踐,在開發過程中,經常會遇到需要使用事件來觸發方法執行的情況,比如CS中按鈕的點選事件,滑鼠移動事件,鍵盤監聽事件等等,有時候需要執行比較耗時的任務,但並不希望阻塞主執

一看就懂【來自英雄聯盟蓋倫的怒吼】 Python 詳解設計模式(二)觀察模式

觀察者模式概述 觀察者模式(有時又被稱為模型-檢視(View)模式、源-收聽者(Listener)模式或從屬者模式)是軟體設計模式的一種。在此種模式中,一個目標物件管理所有相依於它的觀察者物件,並且在它本身的狀態改變時主動發出通知。這通常透過呼叫各觀察者所提供的方法來實現。此種模式通常被用來實現事件處理系統