Add RX variance to Stocks example on Observer pattern

This commit is contained in:
Petrutiu Mihai
2016-06-28 17:59:13 +03:00
parent 5d639bf0ab
commit 55ed135ee1
4 changed files with 58 additions and 9 deletions

View File

@@ -15,6 +15,8 @@ namespace BehavioralPatterns
{ {
public static void Main(string[] args) public static void Main(string[] args)
{ {
ObserverPatternExamples.Run();
Console.ReadKey();
//Chain of responsibillity //Chain of responsibillity
//This is usefull when you have a request and you don't know who should process it //This is usefull when you have a request and you don't know who should process it
ChainOfResponsibillityExamples.Run(); ChainOfResponsibillityExamples.Run();
@@ -40,8 +42,6 @@ namespace BehavioralPatterns
Console.ReadKey(); Console.ReadKey();
ObserverPatternExamples.Run();
Console.ReadKey();
} }
} }

View File

@@ -20,11 +20,21 @@ namespace ObserverPattern
stockExample.RunSimple(); stockExample.RunSimple();
GoToNextStep(); GoToNextStep();
Console.WriteLine("Same business logic using RX");
stockExample.RunReactive();
Console.WriteLine(GetLapsedLinstenerProblem()); 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(); ObservableTwitsExample obsTwits = new ObservableTwitsExample();
obsTwits.Run(); obsTwits.Run();

View File

@@ -1,4 +1,5 @@
using System; using System;
using System.Reactive.Subjects;
namespace ObserverPattern.StockUpdateEvents namespace ObserverPattern.StockUpdateEvents
{ {
@@ -7,12 +8,12 @@ namespace ObserverPattern.StockUpdateEvents
/// </summary> /// </summary>
public class StockSubject public class StockSubject
{ {
public void UpdateStockValue(Stock s) public void UpdateStockValue(Stock s)
{ {
StockUpdated?.Invoke(this, new StockUpdateEventArgs(s)); StockUpdated?.Invoke(this, new StockUpdateEventArgs(s));
} }
public event EventHandler<StockUpdateEventArgs> StockUpdated; public event EventHandler<StockUpdateEventArgs> StockUpdated;
} }
} }

View File

@@ -3,6 +3,7 @@ using System.Collections.Generic;
using System.Linq; using System.Linq;
using System.Reactive; using System.Reactive;
using System.Reactive.Linq; using System.Reactive.Linq;
using System.Reactive.Subjects;
using System.Threading.Tasks; using System.Threading.Tasks;
namespace ObserverPattern.StockUpdateEvents namespace ObserverPattern.StockUpdateEvents
@@ -20,7 +21,7 @@ namespace ObserverPattern.StockUpdateEvents
PublishUpdateStocks(stockSubject); PublishUpdateStocks(stockSubject);
} }
public void RunReactive() public void RunReactiveWithEvents()
{ {
StockSubject stockSubject = new StockSubject(); StockSubject stockSubject = new StockSubject();
@@ -39,14 +40,38 @@ namespace ObserverPattern.StockUpdateEvents
} }
} }
public void RunReactive()
{
Subject<Stock> stockSubject = new Subject<Stock>();
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<StockUpdateEventArgs> eventP) private void PrintAaplStockPriceUpdate(EventPattern<StockUpdateEventArgs> 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<StockUpdateEventArgs> eventP) private void PrintLondonStockPriceUpdate(EventPattern<StockUpdateEventArgs> 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) 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 = 2 });
stockSubject.UpdateStockValue(new Stock { Name = "FTSE", Value = 3 }); stockSubject.UpdateStockValue(new Stock { Name = "FTSE", Value = 3 });
} }
private static void PublishUpdateStocks(Subject<Stock> 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 });
}
} }
} }