观察者设计模式C#事件实现

using System.Collections.Generic;
using System;
using UnityEngine;

public delegate void Subject(EventArgs e); //分不同的EventArgs继承
//一种主题就是一种事件类型
//为了防止类爆炸,把主题换成委托
//确保只有一个EventSystem
public enum EventType
{
    Subject1 = 1,
    Subject2
}
public class EventSystem //以发生主题的类对象作为参数
{
    public static Dictionary<EventType, Subject> Events; //key-事件类型 value-对应的主题,<P>具体主题类

    private static EventSystem _Instance;
    public static EventSystem Instance
    {
        get
        {
            if (_Instance == null)
            {
                _Instance = new EventSystem();
                Events = new Dictionary<EventType, Subject>();
            }
            return _Instance;
        }
    }
    private EventSystem()
    {
    }
    //订阅
    public void Attach(EventType eventType,Subject sub)
    {
        if(!Events.ContainsKey(eventType))
        {
            Events.Add(eventType, sub);
            return;
        }
        Events[eventType] += sub;
    }
    //取消订阅
    public void Detach(EventType eventType,Subject sub)
    {
        if(!Events.ContainsKey(eventType))
        {
            Debug.Log("没有这个事件类型");
            return;
        }
        Events[eventType] -= sub;
    }
    //通知
    public void Notify(EventType eventType,EventArgs args)
    {
        if(!Events.ContainsKey(eventType))
        {
            Debug.Log("没有这个事件类型");
            return;
        }
        Events[eventType].Invoke(args);
    }
}
using UnityEngine;

public class Observer1
{
    public void Init()
    {
        EventSystem.Instance.Attach(EventType.Subject1, (args) =>
        {
            Subject1Args a = args as Subject1Args;
            if(a==null)
            {
                Debug.LogError("Observer1监听事件的方法调用的不对");
                return;
            }
            Debug.Log("Observer1订阅了" + a.GetName()+"正在被调用");
        });
        EventSystem.Instance.Attach(EventType.Subject2, (args) =>
        {
            Subject2Args a = args as Subject2Args;
            Debug.Log("Observer2订阅了" + a.GetName() + "正在被调用");
        });
    }
}
using UnityEngine;

public class Observer2
{
    public void Init()
    {
        EventSystem.Instance.Attach(EventType.Subject1, (args) =>
        {
            Subject1Args a = args as Subject1Args;
            if (a == null)
            {
                Debug.LogError("Observer2监听事件的方法调用的不对");
                return;
            }
            Debug.Log("Observer2订阅了" + a.GetName() + "正在被调用");
        });
    }
}
using System;

public class Subject1Args : EventArgs
{
    string Name;
    public string GetName()
    {
        return Name;
    }
    public Subject1Args(string name)
    {
        this.Name = name;
    }
}
using System;

public class Subject2Args : EventArgs
{
    string Name;
    public string GetName()
    {
        return Name;
    }
    public Subject2Args(string name)
    {
        this.Name = name;
    }
}
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

namespace demospace
{
	public class test : MonoBehaviour
	{
   		void Start()
    	{
            var obs1 = new Observer1();
            var obs2 = new Observer2();
            obs1.Init();
            obs2.Init();
            EventSystem.Instance.Notify(EventType.Subject1, new Subject1Args("Subject1"));
            EventSystem.Instance.Notify(EventType.Subject2, new Subject2Args("Subject2"));
        }

		
	}
}

发布了67 篇原创文章 · 获赞 7 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/Icecoldless/article/details/103813235