委托的单例模式
在项目中我们经常会使用到委托,委托是多播的,如果控制不好反复注册就会多次触发,可以使用委托的单例模式去注册,这样可以避免多次触发问题。
下面是几种委托实例代码:
带参数委托管理:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 | /// <summary> /// 带参数的委托管理 /// </summary> public class ActionManager<T> { /// <summary> /// 用于存放ViewModel之间的委托 /// </summary> public static Dictionary< string , Action<T>> _actions = new Dictionary< string , Action<T>>(); /// <summary> /// 注册委托 /// </summary> /// <param name="name">委托名称</param> /// <param name="action">委托</param> public static void Register( string name, Action<T> action) { // 如果没有委托才注册,如果有不能注册,以防止重复注册 lock (_actions) { if (!_actions.ContainsKey(name)) _actions.Add(name, action); } } /// <summary> /// 执行委托方法 /// </summary> /// <param name="name">委托名称</param> public static void Invoke( string name, T value) { // 执行委托方法 lock (_actions) { if (_actions.ContainsKey(name)) _actions[name].Invoke(value); } } /// <summary> /// 移除委托 /// </summary> /// <param name="name"></param> public static void Removal( string name) { lock (_actions) { if (_actions.ContainsKey(name)) _actions.Remove(name); } } } |
调用方法:
ActionManager<参数>.Removal("注册Key");
ActionManager<参数>.Register("注册Key", 执行方法);
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | // 注册委托 ActionManager< string >.Removal( "updateUser" ); ActionManager< string >.Register( "updateUser" , str => { try { Console.WriteLine(str); } catch (Exception ex) { // 需使用logNet4 记录log日志,这样有助于发生异常后排查问题,委托中的异常不会抛出来。 throw ; } }); // 执行委托 ActionManager< string >.Invoke( "updateUser" , "Hello World!" ); |
不带参数委托管理:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 | /// <summary> /// 委托管理-不带参数 /// 用于解决ViewModel与ViewModel间的相互调用 /// </summary> public class ActionManager { /// <summary> /// 用于存放ViewModel之间的委托 /// </summary> public static Dictionary< string , Action> _actions = new Dictionary< string , Action>(); /// <summary> /// 注册委托 /// </summary> /// <param name="name">委托名称</param> /// <param name="action">委托</param> public static void Register( string name, Action action) { // 如果没有委托才注册,如果有不能注册,以防止重复注册 lock (_actions) { if (!_actions.ContainsKey(name)) _actions.Add(name, action); } } /// <summary> /// 执行委托方法 /// </summary> /// <param name="name">委托名称</param> public static void Invoke( string name) { // 执行委托方法 lock (_actions) { if (_actions.ContainsKey(name)) _actions[name].Invoke(); } } /// <summary> /// 移除委托 /// </summary> /// <param name="name"></param> public static void Removal( string name) { lock (_actions) { if (_actions.ContainsKey(name)) _actions.Remove(name); } } } |
带参数与返回值的委托管理:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 | /// <summary> /// 委托管理-带参数与返回值委托管理 /// 用于解决ViewModel与ViewModel间的相互调用 /// </summary> public class FuncManager2<T> where T : class { /// <summary> /// 用于存放ViewModel之间的委托 /// </summary> static Dictionary< string , Func<T, bool >> _Funcs = new Dictionary< string , Func<T, bool >>(); /// <summary> /// 注册委托 /// </summary> /// <param name="name">委托名称</param> /// <param name="func">委托</param> public static void Register( string name, Func<T, bool > func) { // 如果没有委托才注册,如果有不能注册,以防止重复注册 if (!_Funcs.ContainsKey(name)) _Funcs.Add(name, func); } /// <summary> /// 执行委托方法 /// </summary> /// <param name="name">委托名称</param> /// <param name="value">委托参数</param> /// <returns></returns> public static bool Invoke( string name, T value) { // 执行委托方法 if (_Funcs.ContainsKey(name)) return _Funcs[name].Invoke(value); return false ; } } |
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek “源神”启动!「GitHub 热点速览」
· 我与微信审核的“相爱相杀”看个人小程序副业
· 上周热点回顾(2.17-2.23)
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· 如何使用 Uni-app 实现视频聊天(源码,支持安卓、iOS)