1. 程式人生 > >觀察者模式(利用委托)

觀察者模式(利用委托)

利用 lin 定義 cati eve 實例化 namespace esp spa

1.添加三個類文件,定義三個類(貓、狗、老鼠)

  貓是主要事件

namespace MyDelegate
{
    public class Cat
    {
        public CatMiaoHandler CatMiaoHandlerMethod;//在Cat類實例化一個委托
        public void Miao()
        {
            Console.WriteLine("貓,叫一聲");
            if (CatMiaoHandlerMethod!=null)//若委托不為空,執行委托
            {
                CatMiaoHandlerMethod();
            }
        }
    }
    
public delegate void CatMiaoHandler(); }
namespace MyDelegate
{
    public class Dog
    {
        public static void Wang()
        {
            Console.WriteLine("狗,叫一聲");
        }
    }
}
namespace MyDelegate
{
    public class Mouse
    {
        public static void Run()
        {
            Console.WriteLine(
"老鼠,跑"); } } }

2.當貓叫時,狗也叫,老鼠跑(這就是觀察者模式)

  Program程序如下

namespace MyDelegate
{
    class Program
    {
        static void Main(string[] args)
        {
            Cat cat = new Cat();
            cat.CatMiaoHandlerMethod = new CatMiaoHandler(Dog.Wang);//委托
            cat.CatMiaoHandlerMethod 
+= Mouse.Run;//多播委托, cat.Miao(); Console.Read(); } } }

3.委托和事件的區別

namespace MyDelegate
{
    class Program
    {
        static void Main(string[] args)
        {
            Cat cat = new Cat();
            //--------------------------對比----------------------------
            //cat.CatMiaoHandlerMethodEvent = new CatMiaoHandler(Dog.Wang); //此處會報錯,事件不能實例化
            //cat.CatMiaoHandlerMethodEvent = null;//此處會報錯,事件不能賦null值
            //cat.CatMiaoHandlerMethodEvent();//此處會報錯,事件不能被外部調用
            //cat.CatMiaoHandlerMethod = new CatMiaoHandler(Dog.Wang);//委托可以實例化
            //cat.CatMiaoHandlerMethod = null;//委托可以賦值為null
            //cat.CatMiaoHandlerMethod();//委托可以直接調用
            //--------------------------總結---------------------------
            //委托不太安全,可能會被外部清除已經賦予的委托函數
            cat.CatMiaoHandlerMethod += Dog.Wang;
            cat.CatMiaoHandlerMethod += Mouse.Run;
            cat.Miao();
            //事件只能進行-=或+=賦值,不能進行=new或=null操作
            cat.CatMiaoHandlerMethodEvent += Dog.Wang;
            cat.CatMiaoHandlerMethodEvent += Mouse.Run;
            cat.Miao();

            Console.Read();
        }
    }
}

  另外,委托可以按委托調用函數的順序查看委托函數,而事件查看不了

foreach(CatMiaoHandler s in cat.CatMiaoHandlerMethod.GetInvocationList())
{
  Console.WriteLine(s.Method);
}

觀察者模式(利用委托)