Предположим, разработка автономной системы вождения. В начале своего проектирования система автопилота имеет нумерационный тип команд системы вождения:
enum DriveCommand
{
Начало,
stop
}
Предположим также, что существует метод вождения, который обрабатывает команды, получаемые транспортным средством. Сначала мы кодируем так:
статическая пустота Main (string [] args)
{
DriveCommand comand=DriveCommand.Start;
Drive(comand);
comand=DriveCommand.Stop;
Drive(command);
}
static void Drive(DriveCommand command)
{
if(command==DriveCommand.Start)
{
// запуск автомобиля
} else if(command==DriveCommand.Stop)
{
//Автомобиль останавливается
}
}
Или с переключателем:
static void Drive(DriveCommand command)
{
switch(command)
{
case DriveCommand.Start:
// запуск автомобиля
break;
case DriveCommand.Stop:
//Автомобиль останавливается
break;
default:
break;
}
}
По мере разработки новых функций мы добавляем все больше и больше команд.
enum DriveCommand
{
Начало,
останавливаться,
Пауза,
turnLeft
.
.
}
С увеличением количества элементов DriveCommand использование оператора if или оператора switch будет очень запутанным, и у вас могут быть сотни различных команд в сложном Xiongtai. Для каждой дополнительной команды мы должны изменить метод Drive. Метод Drive был бы чрезвычайно раздутым, и каждая строка кода была бы почти идентичной.
В этом случае мы должны рассмотреть вопрос о рефакторинге исходного кода и соблюдении принципа открытого-закрытого в шаблоне проектирования. Принцип открытого-закрытого означает: открыть для расширения, закрыть для модификации.
Создайте абстрактный класс:
abstract class Commander
{
public abstract void Execute();
}
Все команды, такие как Start или Stop, наследуются от этого абстрактного класса.
класс StartCommander: Командир
{
public override void Execute()
{
//запускать
}
}
класс StopCommander: Командир
{
public override void Execute()
{
//останавливаться
}
}
После использования полиморфизма следующий код изменяется на:
static void Main(string[] args)
{
Commander commander=new StartCommander();
Driver(commander);
commander=new StopCommander();
Driver(commander);
}
static void Drive(Commander commander)
{
commander.Execute();
}
Таким образом, код намного упрощается, а расширяемость повышается.Для метода Drive, даже если добавить больше имен, изменение выравнивания не требуется.