Add stock example on Observer pattern

This commit is contained in:
Petrutiu Mihai
2016-06-28 17:26:33 +03:00
parent 4a69b3da17
commit 5d639bf0ab
13 changed files with 262 additions and 34 deletions

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

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

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

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

View File

@@ -0,0 +1,12 @@
namespace ObserverPattern.StockUpdateEvents
{
public class StockUpdateEventArgs
{
public Stock Stock { get; set; }
public StockUpdateEventArgs(Stock stock)
{
Stock = stock;
}
}
}

View File

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