1. 程式人生 > >快速學習——10、委託、事件-觀察者模式(一)

快速學習——10、委託、事件-觀察者模式(一)

這篇我們先不講委託事件,從一些理論來

物件直接的關係

一對一 :人只有一個身份證號碼

一對多:一個人可以有多個號碼 (qq號 電話號 車牌號 等)

多對多:多個人 多個號碼  

觀察者模式

觀察者模式,又稱為釋出訂閱模式,基於一對多的原理。

定義了物件之間的一對多依賴 ,當一個物件改變狀態時,它的所有訂閱者都會收到通知並自動更新 

舉例直播

你訂閱了一個主播。 當主播上線直播時,就會通知你。 

  1. 主播任務就是直播,他不知道有誰,多少人再訂閱他(假設)
  2. 當你訂閱主播,只要主播開播,便可以收到主播開播的訊息
  3. 有訂閱就有取消訂閱 (粉轉黑)

那我們用程式碼模擬一下

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  ,當然不是這樣做,看下個文章