Я пытаюсь написать приложение с запуском из командной строки. Я хотел бы реализовать все функции ООП, в частности шаблон проектирования MVC. Честно говоря, я никогда раньше такого не делал (я создавал приложения в интерактивном режиме или с использованием JavaFX GUI). Я создал класс Person, используя потоковый API, проанализировал входную строку. Я создал интерфейс, содержащий метод, который должен иметь разные реализации. Но, как мне кажется, я не иду по правильному пути. Пожалуйста, помогите в дальнейшем развитии. Вот что я имею на сегодня:
Класс модели:
public class Person implements Serializable {
private static final long serialVersionUID = 9005793181629487010L;
private static AtomicInteger nextID = new AtomicInteger(0);
private int id;
private String name;
private String surname;
private String age;
private String address;
public Person(int id, String name, String surname, String age, String address) {
this.id = id;
this.name = name;
this.surname = surname;
this.age = age;
this.address = address;
}
public Person(String name, String surname, String age, String address) {
this(nextID.getAndIncrement(), name, surname, age, address);
}
public int getId() {
return id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getSurname() {
return surname;
}
public void setSurname(String surname) {
this.surname = surname;
}
public String getAge() {
return age;
}
public void setAge(String age) {
this.age = age;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
@Override
public String toString() {
return "\n\nID: " + getId() + "\nName: " + getName() + "\nSurname: " + getSurname() + "\nAge: " + getAge() + "\nAddress: " + getAddress();
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Person person = (Person) o;
return Objects.equals(name, person.name) &&
Objects.equals(surname, person.surname) &&
Objects.equals(age, person.age) &&
Objects.equals(address, person.address);
}
@Override
public int hashCode() {
return Objects.hash(name, surname, age, address);
}}
Класс обработки файла, в котором сохраняется вся информация:
public class DataFile {
private File file;
private List<Person> people = new ArrayList<>();
public DataFile(String fileName) {
this.file = new File(fileName);
}
public void save(Person person) {
try(BufferedWriter writer = new BufferedWriter(new FileWriter(file, true))) {
writer.write(person.getName()+ "\r\n" + person.getSurname() + "\r\n" + person.getAge() + "\r\n" + person.getAddress() + "\r\n\r\n");
} catch(IOException e) {
throw new RuntimeException(e);
}
loadAll();
writeToJson();
}
private void loadAll() {
try(BufferedReader reader = new BufferedReader(new FileReader(file))) {
String name;
while((name = reader.readLine()) != null) {
Person person = new Person(name, reader.readLine(), reader.readLine(), reader.readLine());
people.add(person);
reader.readLine();
}
}
catch (IOException e) {
System.out.println(e + "\n\nA new file 'db.txt' will be created.\n");
}
}
private void writeToJson(){
try (BufferedWriter bw = new BufferedWriter(new FileWriter("data_file.json"))) {
Gson gson = new Gson();
bw.write(gson.toJson(people));
bw.flush();
} catch (IOException e) {
throw new RuntimeException(e);
}
}}
Интерфейс, содержащий метод, который обрабатывает каждую команду:
public interface Command {
void execute(Map<String, String> options);}
Реализация команды "добавить в файл":
public class AddCommand implements Command {
@Override
public void execute(Map<String, String> params) {
Person person = new Person(params.get("name"), params.get("surname"), params.get("age"), params.get("address"));
System.out.println(person.toString() + "\n");
params.forEach((k, v) -> System.out.printf("flag: %s - value: %s\n", k, v));
DataFile file = new DataFile("db.txt");
file.save(person);
}}
Ну, основной класс программы:
public class Main {
public static void main(String[] args) {
//Arrays.stream(args).forEach(System.out::println);
Map<String, String> params = new Main().parse(args);
AddCommand add = new AddCommand();
add.execute(params);
}
private Map<String, String> parse(String[] args) {
Map<String, String> parameters = new LinkedHashMap<>();
for (int i = 0; i < args.length; i += 2){
if (i + 1 < args.length){
parameters.put(args[i], args[i + 1]);
}
}
return parameters;
}}
Все это работает, но я не могу понять, как реализовать поиск-замену, удаление и так далее. Может быть, я неправильно сортирую входную строку .. И я не понимаю, как мне нужно обрабатывать команды, такие как add, update, find, view и т. Д. Возможно, необходимо было проанализировать строку с «global» и «local». параметры, т. е. в интерфейсе, задайте аргументы метода для выполнения (Map globalOptions, Map localOptions) ... Где первая карта - это файл и его имя, а вторая карта - это имя, фамилия, возраст и т. д. Но, возможно, я ошибаюсь. Нужна помощь!