Add stock example on Observer pattern
This commit is contained in:
29
src/ObserverPattern/StockUpdateEvents/AaplObserver.cs
Normal file
29
src/ObserverPattern/StockUpdateEvents/AaplObserver.cs
Normal file
@@ -0,0 +1,29 @@
|
||||
using System;
|
||||
|
||||
namespace ObserverPattern.StockUpdateEvents
|
||||
{
|
||||
/// <summary>
|
||||
/// Observer
|
||||
/// </summary>
|
||||
public class AaplObserver
|
||||
{
|
||||
double? oldValue;
|
||||
public AaplObserver(StockSubject stockObservable)
|
||||
{
|
||||
stockObservable.StockUpdated += (obj, e) => PrintNewValue(e.Stock);
|
||||
}
|
||||
|
||||
private void PrintNewValue(Stock stock)
|
||||
{
|
||||
if (stock.Name == "AAPL")
|
||||
{
|
||||
if (oldValue.HasValue)
|
||||
Console.WriteLine("Apple price updated from {0} to {1}", oldValue, stock.Value);
|
||||
else
|
||||
Console.WriteLine("Apple has a new price, new value is: {0}", stock.Value);
|
||||
|
||||
oldValue = stock.Value;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
25
src/ObserverPattern/StockUpdateEvents/LondonStockObserver.cs
Normal file
25
src/ObserverPattern/StockUpdateEvents/LondonStockObserver.cs
Normal file
@@ -0,0 +1,25 @@
|
||||
using System;
|
||||
|
||||
namespace ObserverPattern.StockUpdateEvents
|
||||
{
|
||||
public class LondonStockObserver
|
||||
{
|
||||
double? oldValue;
|
||||
public LondonStockObserver(StockSubject stockObservable)
|
||||
{
|
||||
stockObservable.StockUpdated += (obj, e) => PrintStockValue(e.Stock);
|
||||
}
|
||||
|
||||
private void PrintStockValue(Stock stock)
|
||||
{
|
||||
if (stock.Name == "FTSE")
|
||||
{
|
||||
if (oldValue.HasValue)
|
||||
Console.WriteLine("The Financial Times Stock Exchange 100 Index price updated from {0} to {1}", oldValue, stock.Value);
|
||||
else
|
||||
Console.WriteLine("The Financial Times Stock Exchange 100 Index has a new price, new value is: {0}", stock.Value);
|
||||
oldValue = stock.Value;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
10
src/ObserverPattern/StockUpdateEvents/Stock.cs
Normal file
10
src/ObserverPattern/StockUpdateEvents/Stock.cs
Normal file
@@ -0,0 +1,10 @@
|
||||
namespace ObserverPattern.StockUpdateEvents
|
||||
{
|
||||
public class Stock
|
||||
{
|
||||
public string Name { get; set; }
|
||||
public int Quantity { get; set; }
|
||||
|
||||
public double Value { get; set; }
|
||||
}
|
||||
}
|
||||
18
src/ObserverPattern/StockUpdateEvents/StockSubject.cs
Normal file
18
src/ObserverPattern/StockUpdateEvents/StockSubject.cs
Normal file
@@ -0,0 +1,18 @@
|
||||
using System;
|
||||
|
||||
namespace ObserverPattern.StockUpdateEvents
|
||||
{
|
||||
/// <summary>
|
||||
/// Subject
|
||||
/// </summary>
|
||||
public class StockSubject
|
||||
{
|
||||
|
||||
public void UpdateStockValue(Stock s)
|
||||
{
|
||||
StockUpdated?.Invoke(this, new StockUpdateEventArgs(s));
|
||||
}
|
||||
|
||||
public event EventHandler<StockUpdateEventArgs> StockUpdated;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,12 @@
|
||||
namespace ObserverPattern.StockUpdateEvents
|
||||
{
|
||||
public class StockUpdateEventArgs
|
||||
{
|
||||
public Stock Stock { get; set; }
|
||||
|
||||
public StockUpdateEventArgs(Stock stock)
|
||||
{
|
||||
Stock = stock;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,65 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Reactive;
|
||||
using System.Reactive.Linq;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace ObserverPattern.StockUpdateEvents
|
||||
{
|
||||
public class StockUpdateEventsExample
|
||||
{
|
||||
public void RunSimple()
|
||||
{
|
||||
StockSubject stockSubject = new StockSubject();
|
||||
|
||||
LondonStockObserver londonObserver = new LondonStockObserver(stockSubject);
|
||||
|
||||
AaplObserver aaplObserver = new AaplObserver(stockSubject);
|
||||
|
||||
PublishUpdateStocks(stockSubject);
|
||||
}
|
||||
|
||||
public void RunReactive()
|
||||
{
|
||||
StockSubject stockSubject = new StockSubject();
|
||||
|
||||
var londonObserver = Observable.FromEventPattern<StockUpdateEventArgs>(
|
||||
ev => stockSubject.StockUpdated += ev,
|
||||
ev => stockSubject.StockUpdated -= ev).Where(s => s.EventArgs.Stock.Name == "FTSE");
|
||||
|
||||
var aaplObserver = Observable.FromEventPattern<StockUpdateEventArgs>(
|
||||
ev => stockSubject.StockUpdated += ev,
|
||||
ev => stockSubject.StockUpdated -= ev).Where(s => s.EventArgs.Stock.Name == "AAPL");
|
||||
|
||||
using (londonObserver.Subscribe(PrintLondonStockPriceUpdate))
|
||||
using (aaplObserver.Subscribe(PrintAaplStockPriceUpdate))
|
||||
{
|
||||
PublishUpdateStocks(stockSubject);
|
||||
}
|
||||
}
|
||||
|
||||
private void PrintAaplStockPriceUpdate(EventPattern<StockUpdateEventArgs> eventP)
|
||||
{
|
||||
Console.WriteLine("apple updated, new value: {0}", eventP.EventArgs.Stock.Value);
|
||||
}
|
||||
|
||||
private void PrintLondonStockPriceUpdate(EventPattern<StockUpdateEventArgs> eventP)
|
||||
{
|
||||
Console.WriteLine("london stock updated, new value: {0}", eventP.EventArgs.Stock.Value);
|
||||
}
|
||||
|
||||
private static void PublishUpdateStocks(StockSubject stockSubject)
|
||||
{
|
||||
stockSubject.UpdateStockValue(new Stock { Name = "AAPL", Value = 3 });
|
||||
stockSubject.UpdateStockValue(new Stock { Name = "AAPL", Value = 4 });
|
||||
stockSubject.UpdateStockValue(new Stock { Name = "AAPL", Value = 5 });
|
||||
stockSubject.UpdateStockValue(new Stock { Name = "AAPL", Value = 6 });
|
||||
|
||||
stockSubject.UpdateStockValue(new Stock { Name = "FTSE", Value = 6 });
|
||||
stockSubject.UpdateStockValue(new Stock { Name = "FTSE", Value = 12 });
|
||||
stockSubject.UpdateStockValue(new Stock { Name = "FTSE", Value = 2 });
|
||||
stockSubject.UpdateStockValue(new Stock { Name = "FTSE", Value = 3 });
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user