Как залезть на несколько уровней абстракции ниже, не плодя кривой код? Есть приложение-прокси, которое запрашивает команды с сервера и отправляет их на нужные локальные адреса. Прокси не знает и не заглядывает во внутренний формат команд, все они обрабатываются одинаково. Возникла задача для двух определенных команд реализовать отдельную стратегию обработки с частичным разбором внутреннего формата. На ум приходит некрасивое решение - непосредственно в общий код обработки команд добавить:if(command_type == A) { Xml.Parse(command_payload); if(Xml.ContainsKey("some_key") { DoSomething1(); } else { DoSomething2(); } } else { ProcessGenericCommand(); } Понимаю, что это плохое решение, но опыта не хватает понять, как сделать лучше. Как правильно решаются такие задачи?
Для более элегантного и правильного решения задачи, можно воспользоваться паттерном стратегии.
Создайте интерфейс или абстрактный класс стратегии обработки команд:public interface CommandStrategy { void processCommand(String commandPayload); }Реализуйте отдельные классы стратегий для обработки каждой конкретной команды:public class CommandAStrategy implements CommandStrategy { @Override public void processCommand(String commandPayload) { Xml.Parse(commandPayload); if(Xml.ContainsKey("some_key")) { DoSomething1(); } else { DoSomething2(); } } } public class CommandBStrategy implements CommandStrategy { @Override public void processCommand(String commandPayload) { // обработка команды B } }В классе прокси используйте стратегию для обработки команды:public class Proxy { private CommandStrategy commandStrategy; public void setCommandStrategy(CommandStrategy commandStrategy) { this.commandStrategy = commandStrategy; } public void processCommand(String commandPayload) { commandStrategy.processCommand(commandPayload); } }
Теперь, при получении команды от сервера, вы можете выбрать соответствующую стратегию и использовать ее для обработки команды, не нарушая принципов чистоты и модульности кода.
Для более элегантного и правильного решения задачи, можно воспользоваться паттерном стратегии.
Создайте интерфейс или абстрактный класс стратегии обработки команд:public interface CommandStrategy {void processCommand(String commandPayload);
}Реализуйте отдельные классы стратегий для обработки каждой конкретной команды:public class CommandAStrategy implements CommandStrategy {
@Override
public void processCommand(String commandPayload) {
Xml.Parse(commandPayload);
if(Xml.ContainsKey("some_key")) {
DoSomething1();
} else {
DoSomething2();
}
}
}
public class CommandBStrategy implements CommandStrategy {
@Override
public void processCommand(String commandPayload) {
// обработка команды B
}
}В классе прокси используйте стратегию для обработки команды:public class Proxy {
private CommandStrategy commandStrategy;
public void setCommandStrategy(CommandStrategy commandStrategy) {
this.commandStrategy = commandStrategy;
}
public void processCommand(String commandPayload) {
commandStrategy.processCommand(commandPayload);
}
}
Теперь, при получении команды от сервера, вы можете выбрать соответствующую стратегию и использовать ее для обработки команды, не нарушая принципов чистоты и модульности кода.