Вот еще один пример, который вы можете использовать, чтобы понять, как работает шаблон команд, используя реальные сценарии: вы не можете путешествовать из одного места в другое на самолете, не используя шаблон команд!
Если вы часто путешествуете, все, что вам нужно как клиенту, - это путешествовать от того места, где вы находитесь, к другому. вас не волнует, как пилот будет летать на самолете или какая авиакомпания будет доступна ... вы не можете предсказать это. все, что вы хотите, это получить воздушный порт и сказать им, чтобы доставить вас к месту назначения.
Но если вы сделаете это, над вашим командованием в администрации аэропорта будут смеяться! им нужно, чтобы вы предоставили объект команды, который является вашим билетом. если вам все равно, какая авиакомпания или тип самолета, когда вы готовы к полету, вам необходимо предоставить объект команды билета. Сотрудник аэропорта, который является служащим аэропорта, должен проверить вашу команду (билет), чтобы они могли ее подтвердить, отменить, если она фальшивая, повторить, если они допустили ошибку (без необходимости проходить весь процесс бронирования) ,
Короче говоря, они хотят иметь полный контроль над вашей командой (билетом), прежде чем решить, следует ли вызывать или выполнять вашу команду, что позволяет авиакомпании (получателю) выполнить (посадить вас в самолет и доставить вас к место назначения) .
Имейте в виду, ваша команда (ваш билет) уже имеет информацию о получателе (авиакомпании), без которой чиновники аэропорта даже не начнут обрабатывать ваш билет.
Власти аэропорта могут даже иметь кучу билетов, над которыми они работают. они могут отложить мой билет и позволить кому-то, кто пришел за мной, пройти (вызвать билет другого человека перед моим)
Вот код:
[TestClass]
public class Client
{
[TestMethod]
public void MyFlight_UsingCommandPattern()
{
var canadianAirline = new Airline();
AirlineTicket_Command myTicket = new MyAirLineTicket(canadianAirline);
var airportOfficials = new AirportOfficials_Invoker(myTicket);
airportOfficials.ProcessPasengerTicket_And_AllowPassengerToFly_Execute();
//assert not implemented
}
}
public class AirportOfficials_Invoker
{
private AirlineTicket_Command PassengerTicket { set; get; }
public AirportOfficials_Invoker(AirlineTicket_Command passengerTicket)
{
throw new NotImplementedException();
}
public void ProcessPasengerTicket_And_AllowPassengerToFly_Execute()
{
PassengerTicket.Execute();
}
}
public abstract class AirlineTicket_Command
{
protected Airline Airline { set; get; }
protected AirlineTicket_Command(Airline airline)
{
Airline = airline;
}
public abstract void Execute();
}
public class MyAirLineTicket : AirlineTicket_Command
{
public MyAirLineTicket(Airline airline)
: base(airline)
{
}
public override void Execute()
{
Airline.FlyPassenger_Action();
}
}
public class Airline
{
public void FlyPassenger_Action()
{
//this will contain all those stuffs of getting on the plane and flying you to your destination
}
}