Update Command pattern example by adding more examples using buy/sell stock

This commit is contained in:
Petrutiu Mihai
2016-06-23 09:39:23 +03:00
parent ae4beae6c2
commit dd93a7c099
7 changed files with 86 additions and 13 deletions

View File

@@ -17,14 +17,14 @@ namespace BehavioralPatterns
//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();
Console.ReadKey(); //Console.ReadKey();
CommandPatternExamples.Run(); CommandPatternExamples.Run();
Console.ReadKey(); Console.ReadKey();
IteratorPatternExamples.Run(); //IteratorPatternExamples.Run();
Console.ReadKey(); //Console.ReadKey();
} }
} }

View File

@@ -15,11 +15,12 @@ namespace CommandPattern
StockExampleRunner stockExampleRunner = new StockExampleRunner(); StockExampleRunner stockExampleRunner = new StockExampleRunner();
Console.WriteLine(stockExampleRunner.GetDescriptionOfExample()); Console.WriteLine(stockExampleRunner.GetDescriptionOfExample());
GoToNextStep(); GoToNextStep();
stockExampleRunner.Run(); stockExampleRunner.RunWithRealStockSchedule();
stockExampleRunner.Run(); stockExampleRunner.RunWithMarketClosed();
stockExampleRunner.Run(); stockExampleRunner.RunWithMarketOpened();
stockExampleRunner.Run(); stockExampleRunner.RunWithMarketOpeningInTwoSeconds();
} }
private static void GoToNextStep() private static void GoToNextStep()

View File

@@ -12,9 +12,9 @@ namespace CommandPattern.StocksExample
{ {
Stack<Order> ordersNotExecuted; Stack<Order> ordersNotExecuted;
FixedSizedQueue<Order> ordersPlaced; FixedSizedQueue<Order> ordersPlaced;
StockSchedule stockSchedule; IStockSchedule stockSchedule;
public Agent(StockSchedule stockSchedule) public Agent(IStockSchedule stockSchedule)
{ {
ordersNotExecuted = new Stack<Order>(); ordersNotExecuted = new Stack<Order>();
ordersPlaced = new FixedSizedQueue<Order>(10); ordersPlaced = new FixedSizedQueue<Order>(10);

View File

@@ -0,0 +1,11 @@
using System;
namespace CommandPattern.StocksExample
{
public interface IStockSchedule
{
event EventHandler StockExchangedOpened;
bool IsStockOpen();
}
}

View File

@@ -8,11 +8,45 @@ namespace CommandPattern.StocksExample
{ {
public class StockExampleRunner public class StockExampleRunner
{ {
public void Run() public void RunWithRealStockSchedule()
{ {
StocksAPI stocksAPI = new StocksAPI(); Console.WriteLine("Buy/Sell stock with real stock schedule");
Agent agent = new Agent(new StockSchedule()); Agent agent = new Agent(new StockSchedule());
BuyAndSellApplStock(agent);
}
public void RunWithMarketClosed()
{
Console.WriteLine("Buy/Sell stock when the market is closed, and not opening soon");
Agent agent = new Agent(new FakeStockSchedule(false, TimeSpan.FromHours(10)));
BuyAndSellApplStock(agent);
}
public void RunWithMarketOpened()
{
Console.WriteLine("Buy/Sell stock when the market is opened");
Agent agent = new Agent(new FakeStockSchedule(true, TimeSpan.FromHours(10)));
BuyAndSellApplStock(agent);
}
public void RunWithMarketOpeningInTwoSeconds()
{
Console.WriteLine("Buy/Sell stock when the market is closed, but opening in 2 seconds");
Agent agent = new Agent(new FakeStockSchedule(false, TimeSpan.FromSeconds(2)));
BuyAndSellApplStock(agent);
}
private static void BuyAndSellApplStock(Agent agent)
{
StocksAPI stocksAPI = new StocksAPI();
Stock stock = new Stock { Name = "AAPL", Quantity = 20 }; Stock stock = new Stock { Name = "AAPL", Quantity = 20 };
agent.PlaceOrder(new BuyStockOrder(stocksAPI, stock)); agent.PlaceOrder(new BuyStockOrder(stocksAPI, stock));

View File

@@ -3,7 +3,32 @@ using System.Threading;
namespace CommandPattern.StocksExample namespace CommandPattern.StocksExample
{ {
public class StockSchedule public class FakeStockSchedule : IStockSchedule
{
TimeSpan timeWhenMarketOpens;
bool isStockOpen;
public FakeStockSchedule(bool isStockOpen, TimeSpan dueTime)
{
this.isStockOpen = isStockOpen;
if (!isStockOpen)
{
var timer = new Timer((obj) =>
{
this.isStockOpen = true;
StockExchangedOpened?.Invoke(this, null);
}, null, Timeout.Infinite, Timeout.Infinite);
timer.Change((int)dueTime.TotalMilliseconds, Timeout.Infinite);
}
}
public event EventHandler StockExchangedOpened;
public bool IsStockOpen()
{
return isStockOpen;
}
}
public class StockSchedule : IStockSchedule
{ {
TimeSpan openingTime; TimeSpan openingTime;
TimeSpan closingTime; TimeSpan closingTime;

View File

@@ -18,6 +18,8 @@ namespace IteratorPattern
ReadBigFilesExample bigFileExample = new ReadBigFilesExample(); ReadBigFilesExample bigFileExample = new ReadBigFilesExample();
bigFileExample.Run(); bigFileExample.Run();
//Iterator that selects in batches
} }
} }
} }