快速學習——10、委託、事件-觀察者模式(一)
阿新 • • 發佈:2018-12-11
這篇我們先不講委託事件,從一些理論來
物件直接的關係
一對一 :人只有一個身份證號碼
一對多:一個人可以有多個號碼 (qq號 電話號 車牌號 等)
多對多:多個人 多個號碼
觀察者模式
觀察者模式,又稱為釋出訂閱模式,基於一對多的原理。
定義了物件之間的一對多依賴 ,當一個物件改變狀態時,它的所有訂閱者都會收到通知並自動更新
舉例直播:
你訂閱了一個主播。 當主播上線直播時,就會通知你。
- 主播任務就是直播,他不知道有誰,多少人再訂閱他(假設)
- 當你訂閱主播,只要主播開播,便可以收到主播開播的訊息
- 有訂閱就有取消訂閱 (粉轉黑)
那我們用程式碼模擬一下
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace 委託事件 { class Program { static void Main(string[] args) { Host h = new Host("貝爾.格里爾斯"); //宣告一個主播 Player p1 = new Player("玩家1"); Player p2 = new Player("玩家2"); Player p3 = new Player("玩家3"); h.AddPlayer(p1); h.AddPlayer(p2); h.AddPlayer(p3); h.StartHost(); Console.ReadKey(); } } /// <summary> /// 主播 /// </summary> public class Host { public string hostName; public List<Player> playerList = new List<Player>(); public Host(string hostName) { this.hostName = hostName; } /// <summary> /// 開播了 /// </summary> public void StartHost() { Console.WriteLine("我是主播 " + hostName + "開播了" ); if(playerList != null && playerList.Count > 0) //持有list 遍歷通知 { foreach (Player p in playerList) { p.AccepMessage(hostName); //通知開播了 } } } /// <summary> /// 新增觀眾 /// </summary> /// <param name="player"></param> public void AddPlayer(Player player) { this.playerList.Add(player); } } /// <summary> /// 玩家 觀眾 /// </summary> public class Player { public string playerName; public Host host; public Player(string playerName) { this.playerName = playerName; } /// <summary> /// 接受開播了 /// </summary> /// <param name="name"></param> public void AccepMessage(string name) { Console.WriteLine("我是玩家: " + playerName + " " + "收到了 " + name + "開播了的訊息"); } } }
結果 沒有問題 ,主播開播 ,執行通知訂閱觀眾玩家
當然主播也許會播很多遊戲,玩家觀眾也會訂閱很多主播。
那麼繼續在host,和player類中宣告物件? 寫多個list?
主播有玩家的list ,但是多個遊戲呢,就需要多個list ,當然不是這樣做,看下個文章