• 策略模式+单例模式+简单工厂模式:推送服务


    一、功能:

          实现  获取数据  —>根据用户订阅清单进行推送 —> 这里的推送方式:QQ、Email、App、插件等等

          用户可多选推送方式。

    二、实现

    1、推送方式—枚举(位运算):

    [Flags]
        public enum PushType
        {
            QQ = 0,
            Email = 2
        }

    2、策略模式:抽象推送策略

    public interface IPush
        {
            bool Push(object data);
        }

    3、QQ推送+Email推送

    QQ推送:单例模式—静态创建QQ推送服务,线程安全。

     public class QQ : IPush
        {
             QQ()
            {
            }
            private static QQ _instance = new QQ();       
            public static QQ GetInstance()
            {
                return _instance;
            }
    
            public bool Push(object data)
            {
                Console.WriteLine("QQ 推送服务开启,正在推送...");
                Console.WriteLine("QQ 推送成功.");
                return true;
            }
        }

    Email推送:

     public class Email:IPush
        {
            public bool Push(object data)
            {
                Console.WriteLine("邮件 推送服务开启,正在推送...");
                Console.WriteLine("邮件 推送成功.");
                return true;
            }
        }

    4、简单工厂模式创建具体的服务类型

     public static class PushServiceFactory
        {
            public static IPush Creat(PushType type)
            {
                IPush pushService = null;
                switch (type)
                {
                    case PushType.QQ: pushService = QQ.GetInstance(); break;
                    case PushType.Email: pushService = new Email(); break;
                }
                return pushService;
            }
        }

    5、主题:推送服务

    获取订阅清单、处理数据、推送.

    当然这里的推送,是根据用户勾选的推送方式(List<PushType> types)进行遍历推送.

    public class PushProvider
        {
            public object GetUserSubscribedData(string userid)
            {
                Console.WriteLine("获取订阅清单");
                return new object();
            }
    
            public object HandleData(List<object> data)
            {
                Console.WriteLine("处理数据");
                return new object();
            }
        
            public void ExcutePush(object data, List<PushType> types)
            {
                Console.WriteLine("推送数据");
                foreach (PushType type in types)
                {
                    IPush pushService = PushServiceFactory.Creat(type);
                    pushService.Push(data);
                }
            }
        }

    6、调用

     class Program
        {
            static void Main(string[] args)
            {
                //用户勾选订阅方式           
                List<PushStategy.PushType> pushTypes = new List<PushStategy.PushType>() {  PushStategy.PushType.Email };
                //假定:系统需推送的数据
                List<object> resourceData = new List<object>();
                
                
                PushProvider service = new PushProvider();
                //获取用户清单
                object userSubscriptData= service.GetUserSubscribedData("GetDataFromUserID");
                //根据系统数据,筛选出用户数据
                object result = service.HandleData(resourceData);
                //将筛选数据推送至用户
                service.ExcutePush(result, pushTypes);
    
    
                Console.ReadKey();
            }
        }

    7、结语

    通过单例模式重新认知了静态、实例以及多线程,由多线程又重新梳理了内存分配。下篇总结一下。

  • 相关阅读:
    【漏洞复现】CVE2022–21661 WordPress核心框架WP_Query SQL注入漏洞原理分析与复现
    PAT顶级 1001 Battle Over Cities Hard Version (35 分)(最小生成树)
    Leetcode 1001. 网格照明(map)
    2022牛客寒假算法基础集训营4 ABCDEFGHIJK
    KD Tree 模版
    PAT顶级 1003 Universal Travel Sites (35 分)(DP)
    CCFCSP认证 2021123 登机牌条码(90分)
    Leetcode 956. 最高的广告牌(DP)
    Codeforces Round #774 (Div. 2) C. Factorials and Powers of Two(暴力/dfs/位运算)
    第 46 届 ICPC 国际大学生程序设计竞赛亚洲区域赛(上海)I. Steadily Growing Steam(DP)
  • 原文地址:https://www.cnblogs.com/sunchong/p/5052892.html
Copyright © 2020-2023  润新知