Skip to content

Commit

Permalink
Add Observer Pattern
Browse files Browse the repository at this point in the history
  • Loading branch information
oveldman committed Jul 8, 2023
1 parent af96013 commit 3702f87
Show file tree
Hide file tree
Showing 12 changed files with 219 additions and 0 deletions.
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
namespace MadWorld.Frontend.Application.DesignPatterns.ObserverPattern;

public class FormulaOne : ISubject
{
private readonly List<IObserver> _observers = new();
private RacingFlag _racingFlag = RacingFlag.Green;

public void RegisterObserver(IObserver observer)
{
_observers.Add(observer);
}

public void UnregisterObserver(IObserver observer)
{
_observers.Remove(observer);
}

public void NotifyObservers()
{
_observers.ForEach(o => o.Update());
}

public RacingFlag GetRacingFlag()
{
return _racingFlag;
}

public void SetRacingFlag(RacingFlag racingFlag)
{
_racingFlag = racingFlag;
NotifyObservers();
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
namespace MadWorld.Frontend.Application.DesignPatterns.ObserverPattern;

public interface ICar : IDisposable
{
public string Name { get; }
string GetRacingPace();
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
namespace MadWorld.Frontend.Application.DesignPatterns.ObserverPattern;

public interface IObserver : IDisposable
{
void Update();
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
namespace MadWorld.Frontend.Application.DesignPatterns.ObserverPattern;

public interface ISubject
{
void RegisterObserver(IObserver observer);
void UnregisterObserver(IObserver observer);
void NotifyObservers();
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
namespace MadWorld.Frontend.Application.DesignPatterns.ObserverPattern;

public class Mercedes : ICar, IObserver
{
public string Name { get; } = "Mercedes";

private RacingFlag _flag;
private readonly FormulaOne _formulaOne;

public Mercedes(FormulaOne formulaOne)
{
_formulaOne = formulaOne;
_formulaOne.RegisterObserver(this);
}

public void Update()
{
_flag = _formulaOne.GetRacingFlag();
}

public string GetRacingPace()
{
return _flag switch
{
RacingFlag.Green => "Full speed ahead!",
RacingFlag.Yellow => "Slow down!",
RacingFlag.Red => "Stop!",
_ => throw new ArgumentOutOfRangeException()
};
}

public void Dispose()
{
_formulaOne.UnregisterObserver(this);
GC.SuppressFinalize(this);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
namespace MadWorld.Frontend.Application.DesignPatterns.ObserverPattern;

public enum RacingFlag
{
Green,
Yellow,
Red
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
namespace MadWorld.Frontend.Application.DesignPatterns.ObserverPattern;

public class RedBull : ICar, IObserver
{
public string Name { get; } = "Red Bull";

private RacingFlag _flag;
private readonly FormulaOne _formulaOne;

public RedBull(FormulaOne formulaOne)
{
_formulaOne = formulaOne;
_formulaOne.RegisterObserver(this);
}

public void Update()
{
_flag = _formulaOne.GetRacingFlag();
}

public string GetRacingPace()
{
return _flag switch
{
RacingFlag.Green => "Fly away!",
RacingFlag.Yellow => "Go half speed!",
RacingFlag.Red => "Stop!",
_ => throw new ArgumentOutOfRangeException()
};
}

public void Dispose()
{
_formulaOne.UnregisterObserver(this);
GC.SuppressFinalize(this);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
@page "/Learn/DesignPatterns"

<a href="/Learn/DesignPatterns/ObserverPattern" class="btn btn-primary">Observer Patterns</a>
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
@page "/Learn/DesignPatterns/ObserverPattern"

@using MadWorld.Frontend.Application.DesignPatterns.ObserverPattern

<div class="container">
<div class="row">
<div class="col-2">
<button class="btn btn-success" @onclick="() => ChangeFlag(RacingFlag.Green)">Show green flag</button>
</div>
<div class="col-2">
<button class="btn btn-warning" @onclick="() => ChangeFlag(RacingFlag.Yellow)">Show yellow flag</button>
</div>
<div class="col-2">
<button class="btn btn-danger" @onclick="() => ChangeFlag(RacingFlag.Red)">Show red flag</button>
</div>
</div>
<div class="row">
<div class="col-2">
<button class="btn btn-primary" @onclick="AddRedBull">Add Red Bull</button>
</div>
<div class="col-2">
<button class="btn btn-primary" @onclick="AddMercedes">Add Mercedes</button>
</div>
</div>
<div class="row">
@foreach (var car in _formulaOneCars)
{
<div class="col-4">
<div class="card" style="width: 18rem;">
<div class="card-body">
<h5 class="card-title">@car.Name</h5>
<p class="card-text">Speed: @car.GetRacingPace()</p>
<button class="btn btn-danger" @onclick="() => RemoveCar(car)">Remove @car.Name</button>
</div>
</div>
</div>
}
</div>
</div>

Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
using JetBrains.Annotations;
using MadWorld.Frontend.Application.DesignPatterns.ObserverPattern;

namespace MadWorld.Frontend.UI.Suite.Pages.Learn.DesignPatterns.ObserverPattern;

[UsedImplicitly]
public partial class ObserverPattern
{
private readonly FormulaOne _formulaOne = new();
private readonly List<ICar> _formulaOneCars = new();

private void ChangeFlag(RacingFlag flag)
{
_formulaOne.SetRacingFlag(flag);
}

private void AddRedBull()
{
_formulaOneCars.Add(new RedBull(_formulaOne));
}

private void AddMercedes()
{
_formulaOneCars.Add(new Mercedes(_formulaOne));
}

private void RemoveCar(ICar car)
{
_formulaOneCars.Remove(car);
car.Dispose();
}
}
3 changes: 3 additions & 0 deletions MadWorld/MadWorld.Frontend.UI.Suite/Pages/Learn/Learn.razor
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
@page "/Learn"

<a href="/Learn/DesignPatterns" class="btn btn-primary">Design Patterns</a>
5 changes: 5 additions & 0 deletions MadWorld/MadWorld.Frontend.UI.Suite/Shared/NavMenu.razor
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,11 @@
<span class="oi oi-clipboard" aria-hidden="true"></span> Curriculum Vitae
</NavLink>
</div>
<div class="nav-item px-3">
<NavLink class="nav-link" href="/Learn">
<span class="oi oi-eye" aria-hidden="true"></span> Learn
</NavLink>
</div>
</nav>
</div>

Expand Down

0 comments on commit 3702f87

Please sign in to comment.