一、功能:
实现 获取数据 —>根据用户订阅清单进行推送 —> 这里的推送方式: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、结语
通过单例模式重新认知了静态、实例以及多线程,由多线程又重新梳理了内存分配。下篇总结一下。