策略模式+單例模式+簡單工廠模式:推送服務

K戰神發表於2015-12-17

一、功能:

      實現  獲取資料  —>根據使用者訂閱清單進行推送 —> 這裡的推送方式: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、結語

通過單例模式重新認知了靜態、例項以及多執行緒,由多執行緒又重新梳理了記憶體分配。下篇總結一下。

 

相關文章