diff --git a/src/BehavioralPatterns/Program.cs b/src/BehavioralPatterns/Program.cs index feeb977..f86846b 100644 --- a/src/BehavioralPatterns/Program.cs +++ b/src/BehavioralPatterns/Program.cs @@ -15,6 +15,8 @@ namespace BehavioralPatterns { public static void Main(string[] args) { + ObserverPatternExamples.Run(); + Console.ReadKey(); //Chain of responsibillity //This is usefull when you have a request and you don't know who should process it ChainOfResponsibillityExamples.Run(); @@ -40,8 +42,6 @@ namespace BehavioralPatterns Console.ReadKey(); - ObserverPatternExamples.Run(); - Console.ReadKey(); } } diff --git a/src/ObserverPattern/ObserverPatternExamples.cs b/src/ObserverPattern/ObserverPatternExamples.cs index de480a8..ae10ae6 100644 --- a/src/ObserverPattern/ObserverPatternExamples.cs +++ b/src/ObserverPattern/ObserverPatternExamples.cs @@ -19,12 +19,22 @@ namespace ObserverPattern StockUpdateEventsExample stockExample = new StockUpdateEventsExample(); stockExample.RunSimple(); - GoToNextStep(); - Console.WriteLine("Same business logic using RX"); - stockExample.RunReactive(); + GoToNextStep(); Console.WriteLine(GetLapsedLinstenerProblem()); + GoToNextStep(); + + Console.WriteLine("Same business logic using events combined with RX library"); + stockExample.RunReactiveWithEvents(); + + GoToNextStep(); + + Console.WriteLine("Same business logic using RX library"); + stockExample.RunReactive(); + + GoToNextStep(); + ObservableTwitsExample obsTwits = new ObservableTwitsExample(); obsTwits.Run(); diff --git a/src/ObserverPattern/StockUpdateEvents/StockSubject.cs b/src/ObserverPattern/StockUpdateEvents/StockSubject.cs index db10ba8..07a9d44 100644 --- a/src/ObserverPattern/StockUpdateEvents/StockSubject.cs +++ b/src/ObserverPattern/StockUpdateEvents/StockSubject.cs @@ -1,4 +1,5 @@ using System; +using System.Reactive.Subjects; namespace ObserverPattern.StockUpdateEvents { @@ -7,12 +8,12 @@ namespace ObserverPattern.StockUpdateEvents /// public class StockSubject { - public void UpdateStockValue(Stock s) { StockUpdated?.Invoke(this, new StockUpdateEventArgs(s)); } public event EventHandler StockUpdated; + } } \ No newline at end of file diff --git a/src/ObserverPattern/StockUpdateEvents/StockUpdateEventsExample.cs b/src/ObserverPattern/StockUpdateEvents/StockUpdateEventsExample.cs index bb2b740..938afb4 100644 --- a/src/ObserverPattern/StockUpdateEvents/StockUpdateEventsExample.cs +++ b/src/ObserverPattern/StockUpdateEvents/StockUpdateEventsExample.cs @@ -3,6 +3,7 @@ using System.Collections.Generic; using System.Linq; using System.Reactive; using System.Reactive.Linq; +using System.Reactive.Subjects; using System.Threading.Tasks; namespace ObserverPattern.StockUpdateEvents @@ -20,7 +21,7 @@ namespace ObserverPattern.StockUpdateEvents PublishUpdateStocks(stockSubject); } - public void RunReactive() + public void RunReactiveWithEvents() { StockSubject stockSubject = new StockSubject(); @@ -39,14 +40,38 @@ namespace ObserverPattern.StockUpdateEvents } } + public void RunReactive() + { + Subject stockSubject = new Subject(); + + var londonObserver = stockSubject.Where(s => s.Name == "FTSE"); + var aaplObserver = stockSubject.Where(s => s.Name == "AAPL"); + + using (londonObserver.Subscribe(PrintLondonStockPriceUpdate)) + using (aaplObserver.Subscribe(PrintAaplStockPriceUpdate)) + { + PublishUpdateStocks(stockSubject); + } + } + private void PrintAaplStockPriceUpdate(EventPattern eventP) { - Console.WriteLine("apple updated, new value: {0}", eventP.EventArgs.Stock.Value); + PrintAaplStockPriceUpdate(eventP.EventArgs.Stock); + } + + private void PrintAaplStockPriceUpdate(Stock stock) + { + Console.WriteLine("apple updated, new value: {0}", stock.Value); } private void PrintLondonStockPriceUpdate(EventPattern eventP) { - Console.WriteLine("london stock updated, new value: {0}", eventP.EventArgs.Stock.Value); + PrintLondonStockPriceUpdate(eventP.EventArgs.Stock); + } + + private void PrintLondonStockPriceUpdate(Stock stock) + { + Console.WriteLine("london stock updated, new value: {0}", stock.Value); } private static void PublishUpdateStocks(StockSubject stockSubject) @@ -61,5 +86,18 @@ namespace ObserverPattern.StockUpdateEvents stockSubject.UpdateStockValue(new Stock { Name = "FTSE", Value = 2 }); stockSubject.UpdateStockValue(new Stock { Name = "FTSE", Value = 3 }); } + + private static void PublishUpdateStocks(Subject stockSubject) + { + stockSubject.OnNext(new Stock { Name = "AAPL", Value = 3 }); + stockSubject.OnNext(new Stock { Name = "AAPL", Value = 4 }); + stockSubject.OnNext(new Stock { Name = "AAPL", Value = 5 }); + stockSubject.OnNext(new Stock { Name = "AAPL", Value = 6 }); + + stockSubject.OnNext(new Stock { Name = "FTSE", Value = 6 }); + stockSubject.OnNext(new Stock { Name = "FTSE", Value = 12 }); + stockSubject.OnNext(new Stock { Name = "FTSE", Value = 2 }); + stockSubject.OnNext(new Stock { Name = "FTSE", Value = 3 }); + } } }