예제 #1
0
        static void Main(string[] args)
        {
            var newsSource = new GoogleNewsSource();
            var adSource   = new AdvertisementSource();
            var newsAgency = new MyNewsAgency(newsSource, adSource);

            //Example demoing push model of Observable pattern
            //The news source would publish/push this news to all it's subscribers
            newsSource.PublishNews(new News {
                Headline = "Microsoft jumping into gaming space", Priority = Priority.Low, Category = NewsCategory.Technical, Content = "A good news for gaming enthusiasts as Microsoft to soon launch a new gaming platform."
            });

            var newsPaper = newsAgency.CompileNewsPaper();

            Console.WriteLine("--------------" + newsPaper.Name + "-" + newsPaper.Date.ToShortDateString() + "-----------------");
            int pageNumber = 1;

            foreach (var page in newsPaper.Pages)
            {
                Console.WriteLine("-----Page -" + pageNumber + "--------");
                foreach (var news in page.NewsArticles)
                {
                    Console.WriteLine(news.Headline);
                    Console.WriteLine(news.Content);
                    Console.WriteLine("-----------------------------------");
                }
                Console.WriteLine("----------Advertisements Section-------------------");
                foreach (var add in page.Advertisements)
                {
                    Console.WriteLine(add.Product);
                    Console.WriteLine(add.AdContent);
                    Console.WriteLine("-----------------------------------");
                }
                pageNumber++;
            }
            Console.ReadLine();
        }
        public NewsPaper CompileNewsPaper()
        {
            //Step 1. Fetch all the news from the news source.(This demos the pull mode of the publis-subscribe/observable pattern)
            var newsItems = NewsSource.FetchNews(subscriberId);

            if (newsItems == null || newsItems.Count() <= 0)
            {
                throw new Exception("No news items returned from the news source");
            }
            NewsItems.AddRange(newsItems.OrderBy(n => n.Priority));
            //Step 1.1 Fetch all the ads
            var adds = AdvertisementSource.GetAdds().ToArray();

            //Step 2. Start Compiling newspaper for the fetched news and ads
            var newsPaper = new NewsPaper
            {
                Name  = "The News Express",
                Date  = DateTime.Now.Date,
                Pages = new List <Page>()
            };
            Page page = new Page();

            newsPaper.Pages.Add(page);
            int advertisementEnumerator = 0;

            foreach (var news in NewsItems)
            {
                if (IsPageFull(page))
                {
                    page = new Page();
                    newsPaper.Pages.Add(page);
                }
                if (page.NewsArticles.Count < maxNewsItemsOnPage)
                {
                    page.NewsArticles.Add(news);
                }
                else //max news items added to page, now we can accomodate advertisements
                {
                    //Keep adding advertisements to the page till page is full
                    while (!IsPageFull(page) && advertisementEnumerator < adds.Count())
                    {
                        page.Advertisements.Add(adds[advertisementEnumerator]);
                        advertisementEnumerator++;
                    }
                    //Create new page if after adding advertisements, the page is full, else add news to the same page
                    if (IsPageFull(page))
                    {
                        page = new Page();
                        newsPaper.Pages.Add(page);
                        page.NewsArticles.Add(news);
                    }
                    else
                    {
                        page.NewsArticles.Add(news);
                    }
                }
            }
            //There are still some adds to be placed on the pages
            if (advertisementEnumerator < adds.Count())
            {
                while (advertisementEnumerator < adds.Count())
                {
                    var lastPage = newsPaper.Pages.LastOrDefault();
                    if (!IsPageFull(lastPage))
                    {
                        lastPage.Advertisements.Add(adds[advertisementEnumerator]);
                        advertisementEnumerator++;
                    }
                    else
                    {
                        var newPage = new Page();
                        newsPaper.Pages.Add(newPage);
                        newPage.Advertisements.Add(adds[advertisementEnumerator]);
                        advertisementEnumerator++;
                    }
                }
            }
            return(newsPaper);
        }