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); }