Implemented Strategy Pattern

This commit is contained in:
2019-09-11 15:53:52 -06:00
parent 58a197afbd
commit 6e42363daf
15 changed files with 169 additions and 88 deletions

View File

@@ -26,11 +26,19 @@
<e p="IConsoleLogger.cs" t="Include" />
<e p="IDroneCommands.cs" t="Include" />
<e p="IDroneFactory.cs" t="Include" />
<e p="IMissionCommander.cs" t="Include" />
<e p="IMissionList.cs" t="Include" />
<e p="IMissions.cs" t="Include" />
<e p="IModule.cs" t="Include" />
<e p="IUdpClientWrapper.cs" t="Include" />
<e p="IUdpClientWrapperFactory.cs" t="Include" />
<e p="Missions.cs" t="Include" />
<e p="MissionCommander.cs" t="Include" />
<e p="MissionList.cs" t="Include" />
<e p="Missions" t="Include">
<e p="Mission1.cs" t="Include" />
<e p="Mission2.cs" t="Include" />
<e p="Mission3.cs" t="Include" />
</e>
<e p="obj" t="ExcludeRecursive">
<e p="Debug" t="Include">
<e p="netcoreapp2.2" t="Include">
@@ -40,6 +48,7 @@
</e>
<e p="Program.cs" t="Include" />
<e p="Tello Drone.csproj" t="IncludeRecursive" />
<e p="TestNameAttributes.cs" t="Include" />
<e p="UdpClientWrapper.cs" t="Include" />
<e p="UdpClientWrapperFactory.cs" t="Include" />
</e>

View File

@@ -5,14 +5,15 @@ namespace Tello_Drone
public class ConsoleClient
{
private readonly IMissions _missions;
private readonly IMissionList _missionList;
private readonly IConsoleLogger _consoleLogger;
private readonly IMissionCommander _missionCommander;
public ConsoleClient(IMissions missions, IConsoleLogger consoleLogger)
public ConsoleClient(IMissionList missionList, IConsoleLogger consoleLogger, IMissionCommander missionCommander)
{
_missions = missions;
_missionCommander = missionCommander;
_missionList = missionList;
_consoleLogger = consoleLogger;
_missions.SetUpDrone();
}
public void Run()
@@ -20,27 +21,17 @@ namespace Tello_Drone
while (true)
{
_consoleLogger.Log("Choose a mission to run.");
_consoleLogger.Log("1: Mission 1");
_consoleLogger.Log("2: Mission 2");
_consoleLogger.Log("3: Mission 3");
var userInput = Console.ReadLine();
switch (userInput)
for (int x = 0; x < _missionList.GetMissionList().Count; x++)
{
case "1":
_missions.RunMission1();
break;
case "2":
_missions.RunMission2();
break;
case "exit":
return;
default:
_consoleLogger.Log("Not A Valid Entry...Try Again");
Run();
break;
var currentMission = _missionList.GetMissionList()[x];
_consoleLogger.Log($"{x+1}: {currentMission.Item1}");
}
var userInput = Convert.ToInt16(Console.ReadLine());
_missionCommander.RunMission(_missionList.GetMissionList()[userInput-1].Item2);
}
}

View File

@@ -8,8 +8,11 @@ namespace Tello_Drone
{
container.Register<IDroneFactory, DroneFactory>(Reuse.Singleton);
container.Register<IDroneCommands, DroneComands>(Reuse.Singleton);
container.Register<IMissions, Missions>(Reuse.Singleton);
//container.Register<IMissions, Missions>(Reuse.Singleton);
container.Register<IMissionCommander, MissionCommander>(Reuse.Singleton);
container.Register<IUdpClientWrapperFactory, UdpClientWrapperFactory>(Reuse.Singleton);
container.Register<IConsoleLogger, ConsoleLogger>(Reuse.Singleton);
container.Register<IMissionList, MissionList>(Reuse.Singleton);
}
public void Resolve(IContainer container)

View File

@@ -1,5 +1,3 @@
namespace Tello_Drone
{
public class DroneComands : IDroneCommands

View File

@@ -0,0 +1,7 @@
namespace Tello_Drone
{
public interface IMissionCommander
{
void RunMission(IMissions missions);
}
}

View File

@@ -0,0 +1,9 @@
using System.Collections.Generic;
namespace Tello_Drone
{
public interface IMissionList
{
List<(string, IMissions)> GetMissionList();
}
}

View File

@@ -2,8 +2,6 @@ namespace Tello_Drone
{
public interface IMissions
{
void SetUpDrone();
void RunMission1();
void RunMission2();
void Run(Drone drone);
}
}

View File

@@ -0,0 +1,40 @@
using System;
using System.Linq;
using System.Security.Authentication.ExtendedProtection;
namespace Tello_Drone
{
public class MissionCommander : IMissionCommander
{
private readonly Drone _drone;
public MissionCommander(IDroneFactory droneFactory)
{
_drone = droneFactory.CreateDrone;
}
public void RunMission(IMissions mission)
{
SetUpDrone(3);
mission.Run(_drone);
TearDownDrone();
}
private void SetUpDrone(int retryCount)
{
var inCommandMode = false;
while (inCommandMode != true && retryCount > 0)
{
inCommandMode = _drone.Command();
retryCount--;
}
_drone.TakeOff();
}
private void TearDownDrone()
{
_drone.Land();
}
}
}

View File

@@ -0,0 +1,26 @@
using System;
using System.Collections.Generic;
using System.Dynamic;
using System.Linq;
using System.Reflection;
using FastExpressionCompiler.LightExpression;
using ImTools;
using Tello_Drone.Missions;
namespace Tello_Drone
{
public class MissionList : IMissionList
{
public List<(string, IMissions)> GetMissionList( )
{
var list = new List<(string, IMissions)>();
list.Add(("Mission 1", new Mission1()));
list.Add(("Mission 2", new Mission2()));
list.Add(("Mission 3", new Mission3()));
return list;
}
}
}

View File

@@ -1,56 +0,0 @@
namespace Tello_Drone
{
public class Missions : IMissions
{
private Drone _drone;
private int _setupRetry;
public Missions( IDroneFactory droneFactory)
{
_drone = droneFactory.CreateDrone;
}
public void SetUpDrone()
{
var inCommandMode = false;
while (inCommandMode != true && _setupRetry < 3)
{
inCommandMode = _drone.Command();
_setupRetry++;
}
}
public void RunMission1()
{
MissionSetup();
_drone.Up(20);
_drone.Down(20);
MissionTeardown();
}
public void RunMission2()
{
MissionSetup();
_drone.BackFlip();
_drone.FrontFlip();
_drone.Reverse(300);
_drone.Forward(66);
_drone.Up(20);
MissionTeardown();
}
private void MissionSetup()
{
if (!_drone.InitialTakeOff())
_drone.InitialTakeOff();
}
private void MissionTeardown()
{
_drone.Land();
}
}
}

View File

@@ -0,0 +1,12 @@
namespace Tello_Drone.Missions
{
public class Mission1 : IMissions
{
public void Run(Drone drone)
{
drone.Up(20);
drone.Land();
}
}
}

View File

@@ -0,0 +1,12 @@
namespace Tello_Drone.Missions
{
[TestNameAttributes("Mission 2")]
public class Mission2: IMissions
{
public void Run(Drone drone)
{
}
}
}

View File

@@ -0,0 +1,14 @@
namespace Tello_Drone.Missions
{
public class Mission3 : IMissions
{
public void Run(Drone drone)
{
drone.Up(20);
drone.FrontFlip();
drone.BackFlip();
drone.Left(20);
drone.Right(20);
}
}
}

View File

@@ -5,9 +5,10 @@
static void Main(string[] args)
{
var bootstrapper = BootStrapper.BootstrapSystem(new CoreModule());
var missions = bootstrapper.Resolve<IMissions>();
var missionList = bootstrapper.Resolve<IMissionList>();
var missionCommander = bootstrapper.Resolve<IMissionCommander>();
var consoleLogger = bootstrapper.Resolve<IConsoleLogger>();
var consoleClient = new ConsoleClient(missions, consoleLogger);
var consoleClient = new ConsoleClient(missionList, consoleLogger, missionCommander);
consoleClient.Run();
}
}

View File

@@ -0,0 +1,17 @@
using System;
using System.Dynamic;
using System.Security.Cryptography;
namespace Tello_Drone
{
[AttributeUsage(AttributeTargets.Class)]
public class TestNameAttributes : Attribute
{
public TestNameAttributes(string name)
{
Name = name;
}
public string Name { get; }
}
}