Skip to content

Commit 1a80924

Browse files
committed
Update mediator pattern examples
1 parent ce2e741 commit 1a80924

File tree

13 files changed

+71
-102
lines changed

13 files changed

+71
-102
lines changed

src/BehavioralPatterns/Mediator/MediatorLibrary/AirTrafficControlExample/AirTrafficControlExecutor.cs

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -10,14 +10,14 @@ public static void Execute()
1010
{
1111
ConsoleExtension.WriteSeparator("Air traffic control example");
1212

13-
var airTraficControl = new FrankfurtAirTrafficControl();
13+
var airTrafficControl = new FrankfurtAirTrafficControl();
1414

15-
// Register flights to air trafic control
16-
var flight1 = new AirbusA320("ARB320", 28000, airTraficControl);
17-
var flight2 = new Boeing737("BNG737", 29000, airTraficControl);
18-
var flight3 = new Boeing777("BNG777", 35000, airTraficControl);
15+
var flight1 = new AirbusA320("ARB320", 28000, airTrafficControl);
16+
var flight2 = new Boeing737("BNG737", 29000, airTrafficControl);
17+
var flight3 = new Boeing777("BNG777", 35000, airTrafficControl);
18+
Console.WriteLine($"\nAir traffic control has registered aircraft with the call signs {flight1.CallSign}, {flight2.CallSign} and {flight3.CallSign}.");
1919

2020
Console.WriteLine($"\nChanging altitude for {flight1.CallSign}...");
2121
flight1.Altitude += 1000;
2222
}
23-
}
23+
}

src/BehavioralPatterns/Mediator/MediatorLibrary/AirTrafficControlExample/Components/AirbusA320.cs

Lines changed: 2 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -10,11 +10,5 @@ public AirbusA320(string callSign, int currentAltitude, IAirTrafficControl atc)
1010
{
1111
}
1212

13-
public override int SeatingCapacity
14-
{
15-
get
16-
{
17-
return 180;
18-
}
19-
}
20-
}
13+
public override int SeatingCapacity => 180;
14+
}

src/BehavioralPatterns/Mediator/MediatorLibrary/AirTrafficControlExample/Components/Boeing737.cs

Lines changed: 2 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -10,11 +10,5 @@ public Boeing737(string callSign, int currentAltitude, IAirTrafficControl atc)
1010
{
1111
}
1212

13-
public override int SeatingCapacity
14-
{
15-
get
16-
{
17-
return 143;
18-
}
19-
}
20-
}
13+
public override int SeatingCapacity => 143;
14+
}

src/BehavioralPatterns/Mediator/MediatorLibrary/AirTrafficControlExample/Components/Boeing777.cs

Lines changed: 2 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -10,11 +10,5 @@ public Boeing777(string callSign, int currentAltitude, IAirTrafficControl atc)
1010
{
1111
}
1212

13-
public override int SeatingCapacity
14-
{
15-
get
16-
{
17-
return 368;
18-
}
19-
}
20-
}
13+
public override int SeatingCapacity => 368;
14+
}

src/BehavioralPatterns/Mediator/MediatorLibrary/AirTrafficControlExample/Components/Common/Aircraft.cs

Lines changed: 20 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -4,41 +4,39 @@ namespace MediatorLibrary.AirTrafficControlExample.Components.Common;
44

55
public abstract class Aircraft
66
{
7-
private readonly IAirTrafficControl _airTraficControl;
7+
private readonly IAirTrafficControl _airTrafficControl;
88
private int _currentAltitude;
99

10-
protected Aircraft(string callSign, int currentAltitude, IAirTrafficControl airTraficControl)
10+
protected Aircraft(string callSign, int currentAltitude, IAirTrafficControl airTrafficControl)
1111
{
12-
_airTraficControl = airTraficControl;
13-
_airTraficControl.RegisterAircraftUnderGuidance(this);
14-
1512
CallSign = callSign;
13+
14+
// In this example, IAirTrafficControl interface is passed to components and components are responsible to register themselves to the mediator.
15+
// Be careful with this approach, since the object that is passed to the mediator (this) might not be fully initialized.
16+
// This might not be the best approach for the AirTrafficControlExample, but it's shown for demo purposes as one of possibilities.
17+
// Take a look at GroupChatExample for a different approach.
18+
_airTrafficControl = airTrafficControl;
19+
_airTrafficControl.RegisterAircraftUnderGuidance(this);
1620
Altitude = currentAltitude;
1721
}
1822

1923
public abstract int SeatingCapacity { get; }
2024

21-
public string CallSign { get; private set; }
25+
public string CallSign { get; }
2226

2327
public int Altitude
2428
{
25-
get
26-
{
27-
return _currentAltitude;
28-
}
29+
get => _currentAltitude;
2930
set
3031
{
3132
_currentAltitude = value;
32-
Console.WriteLine($"Aircraft with call sign {CallSign} flies at {_currentAltitude} feet.");
33+
Console.WriteLine($"Aircraft with the call sign {CallSign} flies at {_currentAltitude} feet.");
3334

34-
_airTraficControl.ReceiveAircraftLocation(this);
35+
_airTrafficControl.ReceiveAircraftLocation(this);
3536
}
3637
}
3738

38-
public void Climb(int heightToClimb)
39-
{
40-
Altitude += heightToClimb;
41-
}
39+
public void Climb(int heightToClimb) => Altitude += heightToClimb;
4240

4341
public override bool Equals(object obj)
4442
{
@@ -48,17 +46,12 @@ public override bool Equals(object obj)
4846
}
4947

5048
var incoming = (Aircraft)obj;
51-
return CallSign.Equals(incoming.CallSign);
49+
return CallSign.Equals(incoming.CallSign, StringComparison.Ordinal);
5250
}
5351

54-
public override int GetHashCode()
55-
{
56-
return CallSign.GetHashCode();
57-
}
52+
public override int GetHashCode() => CallSign.GetHashCode();
5853

59-
public void WarnOfAirspaceIntrusionBy(Aircraft aircraft)
60-
{
61-
// Do something in response to the warning
62-
Console.WriteLine($"Aircraft {CallSign} has airspace intrusion by {aircraft.CallSign}.");
63-
}
64-
}
54+
public void WarnOfAirspaceIntrusionBy(Aircraft aircraft) =>
55+
// Do something in response to the warning.
56+
Console.WriteLine($"Aircraft {CallSign} has received notification about airspace intrusion by {aircraft.CallSign}.");
57+
}

src/BehavioralPatterns/Mediator/MediatorLibrary/AirTrafficControlExample/Mediators/Common/IAirTrafficControl.cs

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,5 @@ namespace MediatorLibrary.AirTrafficControlExample.Mediators.Common;
55
public interface IAirTrafficControl
66
{
77
void ReceiveAircraftLocation(Aircraft reportingAircraft);
8-
98
void RegisterAircraftUnderGuidance(Aircraft aircraft);
10-
}
9+
}

src/BehavioralPatterns/Mediator/MediatorLibrary/AirTrafficControlExample/Mediators/FrankfurtAirTrafficControl.cs

Lines changed: 15 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -5,27 +5,32 @@ namespace MediatorLibrary.AirTrafficControlExample.Mediators;
55

66
public class FrankfurtAirTrafficControl : IAirTrafficControl
77
{
8-
private readonly IList<Aircraft> _aircraftsUnderGuidance = new List<Aircraft>();
8+
private readonly Dictionary<string, Aircraft> _aircraftUnderGuidance = new();
99

1010
public void ReceiveAircraftLocation(Aircraft reportingAircraft)
1111
{
12-
foreach (var currentAircraft in _aircraftsUnderGuidance.Where(x => x != reportingAircraft))
12+
var potentiallyAffectedAircraft = _aircraftUnderGuidance
13+
.Values
14+
.Where(a => a.CallSign != reportingAircraft.CallSign);
15+
16+
foreach (var currentAircraft in potentiallyAffectedAircraft)
1317
{
14-
if (Math.Abs(currentAircraft.Altitude - reportingAircraft.Altitude) < 1000)
18+
if (Math.Abs(currentAircraft.Altitude - reportingAircraft.Altitude) >= 1000)
1519
{
16-
Console.WriteLine($"\nAir traffic control will issue request to {reportingAircraft.CallSign} to change altitude.");
17-
18-
currentAircraft.WarnOfAirspaceIntrusionBy(reportingAircraft);
19-
reportingAircraft.Climb(1000);
20+
continue;
2021
}
22+
23+
Console.WriteLine($"\nAir traffic control will issue a warning to {reportingAircraft.CallSign} aircraft about airspace intrusion.");
24+
currentAircraft.WarnOfAirspaceIntrusionBy(reportingAircraft);
25+
reportingAircraft.Climb(1000);
2126
}
2227
}
2328

2429
public void RegisterAircraftUnderGuidance(Aircraft aircraft)
2530
{
26-
if (!_aircraftsUnderGuidance.Contains(aircraft))
31+
if (!_aircraftUnderGuidance.ContainsKey(aircraft.CallSign))
2732
{
28-
_aircraftsUnderGuidance.Add(aircraft);
33+
_aircraftUnderGuidance.Add(aircraft.CallSign, aircraft);
2934
}
3035
}
31-
}
36+
}

src/BehavioralPatterns/Mediator/MediatorLibrary/Executor.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,4 +13,4 @@ public override void Execute()
1313
AirTrafficControlExecutor.Execute();
1414
GroupChatExecutor.Execute();
1515
}
16-
}
16+
}

src/BehavioralPatterns/Mediator/MediatorLibrary/GroupChatExample/Components/Common/User.cs

Lines changed: 4 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -4,22 +4,18 @@ namespace MediatorLibrary.GroupChatExample.Components.Common;
44

55
public abstract class User
66
{
7-
protected IGroupChatMediator _mediator;
7+
protected IGroupChatMediator? _mediator;
88
protected string _name;
99

10-
public User(string name)
10+
protected User(string name)
1111
{
1212
_name = name;
1313
}
1414

1515
public string Name => _name;
1616

17-
public void SetMediator(IGroupChatMediator mediator)
18-
{
19-
_mediator = mediator;
20-
}
17+
public void SetMediator(IGroupChatMediator mediator) => _mediator = mediator;
2118

2219
public abstract void Send(string message);
23-
2420
public abstract void Receive(string message);
25-
}
21+
}

src/BehavioralPatterns/Mediator/MediatorLibrary/GroupChatExample/Components/ViberUser.cs

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -9,14 +9,17 @@ public ViberUser(string name)
99
{
1010
}
1111

12-
public override void Receive(string message)
13-
{
12+
public override void Receive(string message) =>
1413
Console.WriteLine($"{_name} received the message: '{message}'");
15-
}
1614

1715
public override void Send(string message)
1816
{
17+
if (_mediator == null)
18+
{
19+
return;
20+
}
21+
1922
Console.WriteLine($"{_name} is sending the message: '{message}' to the group");
2023
_mediator.SendMessage(message, this);
2124
}
22-
}
25+
}

0 commit comments

Comments
 (0)