diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..df8d7db
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,4 @@
+.idea
+.class
+/out
+/bin
\ No newline at end of file
diff --git a/11111 b/11111
new file mode 100644
index 0000000..dd6a41e
Binary files /dev/null and b/11111 differ
diff --git a/HomeWork.iml b/HomeWork.iml
new file mode 100644
index 0000000..c90834f
--- /dev/null
+++ b/HomeWork.iml
@@ -0,0 +1,11 @@
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/README(Lesson_1).md b/README(Lesson_1).md
new file mode 100644
index 0000000..643fd05
--- /dev/null
+++ b/README(Lesson_1).md
@@ -0,0 +1,14 @@
+# Урок 1. Принципы ООП: Инкапсуляция, наследование, полиморфизм
+
+
+**Реализовать, с учетом ооп подхода, приложение.
+Для проведения исследований с генеалогическим древом.
+Идея: описать некоторое количество компонент, например:
+модель человека и дерева
+Под “проведением исследования” можно понимать например получение всех детей выбранного человека.**
+
+
+
+## Группа: Программист - 21.05.2024
+
+## Студент: Овчинников Максим Сергеевич
diff --git a/README(Lesson_2).md b/README(Lesson_2).md
new file mode 100644
index 0000000..9cd5bbe
--- /dev/null
+++ b/README(Lesson_2).md
@@ -0,0 +1,10 @@
+# Урок 2. Принципы ООП Абстракция и интерфейсы. Пример проектирования
+
+**Дополнить проект методами записи в файл и чтения из файла. Для этого создать отдельный класс и реализовать в нем нужные методы. Для данного класса сделайте интерфейс, который и используйте в своей программе. Пример работы с интерфейсом Serialazable можно найти в материалах к уроку.
+Поправить замечания к первому уроку**
+
+
+
+## Группа: Программист - 21.05.2024
+
+## Студент: Овчинников Максим Сергеевич
diff --git a/README(Lesson_3).md b/README(Lesson_3).md
new file mode 100644
index 0000000..55701d0
--- /dev/null
+++ b/README(Lesson_3).md
@@ -0,0 +1,10 @@
+# Урок 3. Некоторые стандартные интерфейсы Java и примеры их использования
+
+**Продолжаем работать с проектом с семейным деревом.
+Реализовать интерфейс Iterable для дерева.
+Создать методы сортировки списка людей перед выводом, например по имени или по дате рождения (не менее 2)
+Создать пакетную структуру для проекта**
+
+## Группа: Программист - 21.05.2024
+
+## Студент: Овчинников Максим Сергеевич
\ No newline at end of file
diff --git a/family_tree.ser b/family_tree.ser
new file mode 100644
index 0000000..abdcbf2
Binary files /dev/null and b/family_tree.ser differ
diff --git a/src/main/java/familytree/Main.java b/src/main/java/familytree/Main.java
new file mode 100644
index 0000000..1f5b1c0
--- /dev/null
+++ b/src/main/java/familytree/Main.java
@@ -0,0 +1,27 @@
+package familytree;
+
+import familytree.model.FamilyTree;
+import familytree.model.FamilyTreeOperations;
+import familytree.model.Person;
+import familytree.view.ConsoleFamilyTreeView;
+import familytree.view.FamilyTreeView;
+import familytree.presenter.FamilyTreePresenter;
+import familytree.service.*;
+
+public class Main {
+ public static void main(String[] args) {
+ System.setProperty("file.encoding", "UTF-8");
+ System.setProperty("console.encoding", "UTF-8");
+
+ FamilyTreeOperations familyTree = new FamilyTree<>();
+ PersonFactory personFactory = new PersonFactory();
+ FamilyTreeService service = new FamilyTreeService(familyTree, personFactory);
+ FamilyTreeView view = new ConsoleFamilyTreeView();
+ FileOperations fileOps = new FileOperations();
+ FamilyTreeFileManager fileManager = new FamilyTreeFileManager(fileOps);
+
+ FamilyTreePresenter presenter = new FamilyTreePresenter(service, view, fileManager);
+
+ presenter.run();
+ }
+}
\ No newline at end of file
diff --git a/src/main/java/familytree/model/FamilyMember.java b/src/main/java/familytree/model/FamilyMember.java
new file mode 100644
index 0000000..585a258
--- /dev/null
+++ b/src/main/java/familytree/model/FamilyMember.java
@@ -0,0 +1,15 @@
+package familytree.model;
+
+import java.time.LocalDate;
+import java.util.List;
+
+public interface FamilyMember {
+ String getName();
+ LocalDate getDateOfBirth();
+ T getFather();
+ T getMother();
+ void setFather(T father);
+ void setMother(T mother);
+ List getChildren();
+ void addChild(T child);
+}
\ No newline at end of file
diff --git a/src/main/java/familytree/model/FamilyTree.java b/src/main/java/familytree/model/FamilyTree.java
new file mode 100644
index 0000000..f0adfc1
--- /dev/null
+++ b/src/main/java/familytree/model/FamilyTree.java
@@ -0,0 +1,60 @@
+package familytree.model;
+
+import java.io.Serializable;
+import java.util.ArrayList;
+import java.util.Comparator;
+import java.util.Iterator;
+import java.util.List;
+
+public class FamilyTree> implements FamilyTreeOperations, Serializable, Iterable {
+ private static final long serialVersionUID = 1L;
+ private List members;
+
+ public FamilyTree() {
+ this.members = new ArrayList<>();
+ }
+
+ @Override
+ public void addMember(T member) {
+ members.add(member);
+ }
+
+ @Override
+ public List getMembers() {
+ return members;
+ }
+
+ @Override
+ public T findPerson(String name) {
+ for (T member : members) {
+ if (member.getName().equals(name)) {
+ return member;
+ }
+ }
+ return null;
+ }
+
+ @Override
+ public void sortByName() {
+ members.sort(Comparator.comparing(FamilyMember::getName));
+ }
+
+ @Override
+ public void sortByBirthDate() {
+ members.sort(Comparator.comparing(FamilyMember::getDateOfBirth));
+ }
+
+ @Override
+ public Iterator iterator() {
+ return members.iterator();
+ }
+
+ @Override
+ public String toString() {
+ StringBuilder sb = new StringBuilder();
+ for (T member : members) {
+ sb.append(member).append("\n");
+ }
+ return sb.toString();
+ }
+}
\ No newline at end of file
diff --git a/src/main/java/familytree/model/FamilyTreeOperations.java b/src/main/java/familytree/model/FamilyTreeOperations.java
new file mode 100644
index 0000000..ca2433f
--- /dev/null
+++ b/src/main/java/familytree/model/FamilyTreeOperations.java
@@ -0,0 +1,12 @@
+package familytree.model;
+
+import java.io.Serializable;
+import java.util.List;
+
+public interface FamilyTreeOperations> extends Serializable {
+ void addMember(T member);
+ T findPerson(String name);
+ List getMembers();
+ void sortByName();
+ void sortByBirthDate();
+}
\ No newline at end of file
diff --git a/src/main/java/familytree/model/Person.java b/src/main/java/familytree/model/Person.java
new file mode 100644
index 0000000..9499c0c
--- /dev/null
+++ b/src/main/java/familytree/model/Person.java
@@ -0,0 +1,73 @@
+package familytree.model;
+
+import java.io.Serializable;
+import java.time.LocalDate;
+import java.util.ArrayList;
+import java.util.List;
+import java.nio.charset.StandardCharsets;
+
+public class Person implements FamilyMember, Serializable {
+ private static final long serialVersionUID = 1L;
+ private String name;
+ private Person father;
+ private Person mother;
+ private List children;
+ private String gender;
+ private LocalDate dateOfBirth;
+
+ public Person(String name, String gender, LocalDate dateOfBirth) {
+ this.name = name;
+ this.gender = gender;
+ this.dateOfBirth = dateOfBirth;
+ this.children = new ArrayList<>();
+ }
+
+ @Override
+ public String getName() {
+ return name;
+ }
+
+ @Override
+ public Person getFather() {
+ return father;
+ }
+
+ @Override
+ public void setFather(Person father) {
+ this.father = father;
+ }
+
+ @Override
+ public Person getMother() {
+ return mother;
+ }
+
+ @Override
+ public void setMother(Person mother) {
+ this.mother = mother;
+ }
+
+ @Override
+ public List getChildren() {
+ return children;
+ }
+
+ @Override
+ public void addChild(Person child) {
+ this.children.add(child);
+ }
+
+ public String getGender() {
+ return gender;
+ }
+
+ @Override
+ public LocalDate getDateOfBirth() {
+ return dateOfBirth;
+ }
+
+ @Override
+ public String toString() {
+ return new String(String.format("%s (Пол: %s, Дата рождения: %s)", name, gender, dateOfBirth).getBytes(StandardCharsets.UTF_8), StandardCharsets.UTF_8);
+ }
+}
\ No newline at end of file
diff --git a/src/main/java/familytree/presenter/FamilyTreePresenter.java b/src/main/java/familytree/presenter/FamilyTreePresenter.java
new file mode 100644
index 0000000..a145a87
--- /dev/null
+++ b/src/main/java/familytree/presenter/FamilyTreePresenter.java
@@ -0,0 +1,193 @@
+package familytree.presenter;
+
+import familytree.model.FamilyTreeOperations;
+import familytree.model.Person;
+import familytree.view.FamilyTreeView;
+import familytree.service.FamilyTreeService;
+import familytree.service.FamilyTreeFileManager;
+
+import java.util.List;
+
+public class FamilyTreePresenter {
+ private FamilyTreeService service;
+ private FamilyTreeView view;
+ private FamilyTreeFileManager fileManager;
+
+ public FamilyTreePresenter(FamilyTreeService service, FamilyTreeView view, FamilyTreeFileManager fileManager) {
+ this.service = service;
+ this.view = view;
+ this.fileManager = fileManager;
+ }
+
+ public void run() {
+ while (true) {
+ view.displayExtendedMenu();
+ int choice = view.getMenuChoice();
+
+ switch (choice) {
+ case 1:
+ addPerson();
+ break;
+ case 2:
+ findPerson();
+ break;
+ case 3:
+ showAllMembers();
+ break;
+ case 4:
+ service.sortByName();
+ view.displayMessage("Отсортировано по имени");
+ break;
+ case 5:
+ service.sortByBirthDate();
+ view.displayMessage("Отсортировано по дате рождения");
+ break;
+ case 6:
+ saveToFile();
+ break;
+ case 7:
+ loadFromFile();
+ break;
+ case 8:
+ addParentChild();
+ break;
+ case 9:
+ showChildren();
+ break;
+ case 10:
+ showParents();
+ break;
+ case 11:
+ showSiblings();
+ break;
+ case 12:
+ showAncestors();
+ break;
+ case 13:
+ showDescendants();
+ break;
+ case 14:
+ showGenerationCount();
+ break;
+ case 0:
+ return;
+ default:
+ view.displayMessage("Неверный выбор. Попробуйте снова.");
+ }
+ }
+ }
+
+ private void addPerson() {
+ String name = view.getInput("Введите имя: ");
+ String gender = view.getInput("Введите пол (М/Ж): ");
+ String birthDateInput = view.getInput("Введите дату рождения (ГГГГ-ММ-ДД): ");
+
+ service.addPerson(name, gender, birthDateInput);
+ view.displayMessage("Человек добавлен в семейное дерево.");
+ }
+
+ private void findPerson() {
+ String name = view.getInput("Введите имя для поиска: ");
+ Person person = service.findPerson(name);
+ if (person != null) {
+ view.displayMessage("Найдено:");
+ view.displayPerson(person);
+ } else {
+ view.displayMessage("Человек не найден.");
+ }
+ }
+
+ private void showAllMembers() {
+ view.displayMessage("Все члены семьи:");
+ view.displayPersonList(service.getAllMembers());
+ }
+
+ private void saveToFile() {
+ String fileName = view.getInput("Введите имя файла для сохранения: ");
+ try {
+ fileManager.saveToFile(fileName, service.getFamilyTree());
+ view.displayMessage("Семейное дерево сохранено в файл.");
+ } catch (Exception e) {
+ view.displayMessage("Ошибка при сохранении: " + e.getMessage());
+ }
+ }
+
+ private void loadFromFile() {
+ String fileName = view.getInput("Введите имя файла для загрузки: ");
+ try {
+ FamilyTreeOperations loadedTree = (FamilyTreeOperations) fileManager.loadFromFile(fileName);
+ service.setFamilyTree(loadedTree);
+ view.displayMessage("Семейное дерево загружено из файла.");
+ } catch (Exception e) {
+ view.displayMessage("Ошибка при загрузке: " + e.getMessage());
+ }
+ }
+
+ private void addParentChild() {
+ String parentName = view.getInput("Введите имя родителя: ");
+ String childName = view.getInput("Введите имя ребенка: ");
+ service.addParentChild(parentName, childName);
+ view.displayMessage("Отношение родитель-ребенок добавлено.");
+ }
+
+ private void showChildren() {
+ String name = view.getInput("Введите имя человека: ");
+ List children = service.getChildren(name);
+ if (children != null && !children.isEmpty()) {
+ view.displayMessage("Дети:");
+ view.displayPersonList(children);
+ } else {
+ view.displayMessage("У этого человека нет детей или человек не найден.");
+ }
+ }
+
+ private void showParents() {
+ String name = view.getInput("Введите имя человека: ");
+ Person[] parents = service.getParents(name);
+ if (parents != null) {
+ view.displayMessage("Родители:");
+ if (parents[0] != null) view.displayPerson(parents[0]);
+ if (parents[1] != null) view.displayPerson(parents[1]);
+ } else {
+ view.displayMessage("У этого человека нет родителей или человек не найден.");
+ }
+ }
+
+ private void showSiblings() {
+ String name = view.getInput("Введите имя человека: ");
+ List siblings = service.getSiblings(name);
+ if (siblings != null && !siblings.isEmpty()) {
+ view.displayMessage("Братья/сестры:");
+ view.displayPersonList(siblings);
+ } else {
+ view.displayMessage("У этого человека нет братьев/сестер или человек не найден.");
+ }
+ }
+
+ private void showAncestors() {
+ String name = view.getInput("Введите имя человека: ");
+ List ancestors = service.getAncestors(name);
+ if (!ancestors.isEmpty()) {
+ view.displayMessage("Предки:");
+ view.displayPersonList(ancestors);
+ } else {
+ view.displayMessage("У этого человека нет предков или человек не найден.");
+ }
+ }
+
+ private void showDescendants() {
+ String name = view.getInput("Введите имя человека: ");
+ List descendants = service.getDescendants(name);
+ if (!descendants.isEmpty()) {
+ view.displayMessage("Потомки:");
+ view.displayPersonList(descendants);
+ } else {
+ view.displayMessage("У этого человека нет потомков или человек не найден.");
+ }
+ }
+
+ private void showGenerationCount() {
+ int count = service.getGenerationCount();
+ view.displayMessage("Количество поколений в семейном дереве: " + count);
+ }
+}
\ No newline at end of file
diff --git a/src/main/java/familytree/service/FamilyResearch.java b/src/main/java/familytree/service/FamilyResearch.java
new file mode 100644
index 0000000..8e0ae52
--- /dev/null
+++ b/src/main/java/familytree/service/FamilyResearch.java
@@ -0,0 +1,49 @@
+package familytree.service;
+
+import familytree.model.FamilyTree;
+import familytree.model.Person;
+
+import java.util.List;
+import java.util.stream.Collectors;
+
+public class FamilyResearch implements IFamilyResearch {
+ private FamilyTree familyTree;
+
+ public FamilyResearch(FamilyTree familyTree) {
+ this.familyTree = familyTree;
+ }
+
+ @Override
+ public List getChildren(String name) {
+ Person person = familyTree.findPerson(name);
+ return person != null ? person.getChildren() : null;
+ }
+
+ @Override
+ public Person[] getParents(String name) {
+ Person person = familyTree.findPerson(name);
+ if (person != null) {
+ return new Person[]{person.getFather(), person.getMother()};
+ }
+ return null;
+ }
+
+ @Override
+ public List getSiblings(String name) {
+ Person person = familyTree.findPerson(name);
+ if (person != null) {
+ Person father = person.getFather();
+ Person mother = person.getMother();
+ if (father != null) {
+ return father.getChildren().stream()
+ .filter(child -> !child.equals(person))
+ .collect(Collectors.toList());
+ } else if (mother != null) {
+ return mother.getChildren().stream()
+ .filter(child -> !child.equals(person))
+ .collect(Collectors.toList());
+ }
+ }
+ return null;
+ }
+}
\ No newline at end of file
diff --git a/src/main/java/familytree/service/FamilyTreeFileManager.java b/src/main/java/familytree/service/FamilyTreeFileManager.java
new file mode 100644
index 0000000..88328eb
--- /dev/null
+++ b/src/main/java/familytree/service/FamilyTreeFileManager.java
@@ -0,0 +1,20 @@
+package familytree.service;
+
+import familytree.model.FamilyTreeOperations;
+import java.io.IOException;
+
+public class FamilyTreeFileManager {
+ private IFileOperations fileOps;
+
+ public FamilyTreeFileManager(IFileOperations fileOps) {
+ this.fileOps = fileOps;
+ }
+
+ public void saveToFile(String fileName, FamilyTreeOperations> familyTree) throws IOException {
+ fileOps.saveToFile(fileName, familyTree);
+ }
+
+ public FamilyTreeOperations> loadFromFile(String fileName) throws IOException, ClassNotFoundException {
+ return fileOps.loadFromFile(fileName);
+ }
+}
\ No newline at end of file
diff --git a/src/main/java/familytree/service/FamilyTreeService.java b/src/main/java/familytree/service/FamilyTreeService.java
new file mode 100644
index 0000000..fca268b
--- /dev/null
+++ b/src/main/java/familytree/service/FamilyTreeService.java
@@ -0,0 +1,150 @@
+package familytree.service;
+
+import familytree.model.FamilyTree;
+import familytree.model.Person;
+import familytree.model.FamilyTreeOperations;
+
+import java.time.LocalDate;
+import java.util.List;
+import java.util.ArrayList;
+import java.util.stream.Collectors;
+
+public class FamilyTreeService {
+ private FamilyTreeOperations familyTree;
+ private PersonFactory personFactory;
+
+ public FamilyTreeService(FamilyTreeOperations familyTree, PersonFactory personFactory) {
+ this.familyTree = familyTree;
+ this.personFactory = personFactory;
+ }
+
+ public void addPerson(String name, String gender, String birthDateInput) {
+ Person person = personFactory.createPerson(name, gender, birthDateInput);
+ familyTree.addMember(person);
+ }
+
+ public Person findPerson(String name) {
+ return familyTree.findPerson(name);
+ }
+
+ public List getAllMembers() {
+ return familyTree.getMembers();
+ }
+
+ public void sortByName() {
+ familyTree.sortByName();
+ }
+
+ public void sortByBirthDate() {
+ familyTree.sortByBirthDate();
+ }
+
+ public void addParentChild(String parentName, String childName) {
+ Person parent = familyTree.findPerson(parentName);
+ Person child = familyTree.findPerson(childName);
+ if (parent != null && child != null) {
+ parent.addChild(child);
+ if (parent.getGender().equals("Мужской")) {
+ child.setFather(parent);
+ } else {
+ child.setMother(parent);
+ }
+ }
+ }
+
+ public List getChildren(String name) {
+ Person person = familyTree.findPerson(name);
+ return person != null ? person.getChildren() : null;
+ }
+
+ public Person[] getParents(String name) {
+ Person person = familyTree.findPerson(name);
+ if (person != null) {
+ return new Person[]{person.getFather(), person.getMother()};
+ }
+ return null;
+ }
+
+ public List getSiblings(String name) {
+ Person person = familyTree.findPerson(name);
+ if (person != null) {
+ Person father = person.getFather();
+ Person mother = person.getMother();
+ if (father != null) {
+ return father.getChildren().stream()
+ .filter(child -> !child.equals(person))
+ .collect(Collectors.toList());
+ } else if (mother != null) {
+ return mother.getChildren().stream()
+ .filter(child -> !child.equals(person))
+ .collect(Collectors.toList());
+ }
+ }
+ return null;
+ }
+
+ public List getAncestors(String name) {
+ Person person = familyTree.findPerson(name);
+ List ancestors = new ArrayList<>();
+ if (person != null) {
+ addAncestors(person, ancestors);
+ }
+ return ancestors;
+ }
+
+ private void addAncestors(Person person, List ancestors) {
+ if (person.getFather() != null) {
+ ancestors.add(person.getFather());
+ addAncestors(person.getFather(), ancestors);
+ }
+ if (person.getMother() != null) {
+ ancestors.add(person.getMother());
+ addAncestors(person.getMother(), ancestors);
+ }
+ }
+
+ public List getDescendants(String name) {
+ Person person = familyTree.findPerson(name);
+ List descendants = new ArrayList<>();
+ if (person != null) {
+ addDescendants(person, descendants);
+ }
+ return descendants;
+ }
+
+ private void addDescendants(Person person, List descendants) {
+ for (Person child : person.getChildren()) {
+ descendants.add(child);
+ addDescendants(child, descendants);
+ }
+ }
+
+ public int getGenerationCount() {
+ int maxGeneration = 0;
+ for (Person person : familyTree.getMembers()) {
+ int generation = getPersonGeneration(person);
+ if (generation > maxGeneration) {
+ maxGeneration = generation;
+ }
+ }
+ return maxGeneration;
+ }
+
+ private int getPersonGeneration(Person person) {
+ int generation = 0;
+ Person current = person;
+ while (current.getFather() != null || current.getMother() != null) {
+ generation++;
+ current = current.getFather() != null ? current.getFather() : current.getMother();
+ }
+ return generation;
+ }
+
+ public FamilyTreeOperations getFamilyTree() {
+ return familyTree;
+ }
+
+ public void setFamilyTree(FamilyTreeOperations familyTree) {
+ this.familyTree = familyTree;
+ }
+}
diff --git a/src/main/java/familytree/service/FileOperations.java b/src/main/java/familytree/service/FileOperations.java
new file mode 100644
index 0000000..be54adc
--- /dev/null
+++ b/src/main/java/familytree/service/FileOperations.java
@@ -0,0 +1,24 @@
+package familytree.service;
+
+import familytree.model.FamilyTreeOperations;
+import java.io.*;
+
+public class FileOperations implements IFileOperations {
+ @Override
+ public void saveToFile(String fileName, FamilyTreeOperations> familyTree) throws IOException {
+ try (ObjectOutputStream oos = new ObjectOutputStream(
+ new BufferedOutputStream(
+ new FileOutputStream(fileName)))) {
+ oos.writeObject(familyTree);
+ }
+ }
+
+ @Override
+ public FamilyTreeOperations> loadFromFile(String fileName) throws IOException, ClassNotFoundException {
+ try (ObjectInputStream ois = new ObjectInputStream(
+ new BufferedInputStream(
+ new FileInputStream(fileName)))) {
+ return (FamilyTreeOperations>) ois.readObject();
+ }
+ }
+}
\ No newline at end of file
diff --git a/src/main/java/familytree/service/IFamilyResearch.java b/src/main/java/familytree/service/IFamilyResearch.java
new file mode 100644
index 0000000..dbc6859
--- /dev/null
+++ b/src/main/java/familytree/service/IFamilyResearch.java
@@ -0,0 +1,11 @@
+package familytree.service;
+
+import familytree.model.Person;
+
+import java.util.List;
+
+public interface IFamilyResearch {
+ List getChildren(String name);
+ Person[] getParents(String name);
+ List getSiblings(String name);
+}
\ No newline at end of file
diff --git a/src/main/java/familytree/service/IFileOperations.java b/src/main/java/familytree/service/IFileOperations.java
new file mode 100644
index 0000000..dccaabb
--- /dev/null
+++ b/src/main/java/familytree/service/IFileOperations.java
@@ -0,0 +1,9 @@
+package familytree.service;
+
+import familytree.model.FamilyTreeOperations;
+import java.io.IOException;
+
+public interface IFileOperations {
+ void saveToFile(String fileName, FamilyTreeOperations> familyTree) throws IOException;
+ FamilyTreeOperations> loadFromFile(String fileName) throws IOException, ClassNotFoundException;
+}
\ No newline at end of file
diff --git a/src/main/java/familytree/service/PersonFactory.java b/src/main/java/familytree/service/PersonFactory.java
new file mode 100644
index 0000000..4778c5c
--- /dev/null
+++ b/src/main/java/familytree/service/PersonFactory.java
@@ -0,0 +1,12 @@
+package familytree.service;
+
+import familytree.model.Person;
+import java.time.LocalDate;
+
+public class PersonFactory {
+ public Person createPerson(String name, String gender, String birthDateInput) {
+ String normalizedGender = gender.trim().equalsIgnoreCase("М") ? "Мужской" : "Женский";
+ LocalDate birthDate = LocalDate.parse(birthDateInput);
+ return new Person(name, normalizedGender, birthDate);
+ }
+}
\ No newline at end of file
diff --git a/src/main/java/familytree/view/ConsoleFamilyTreeView.java b/src/main/java/familytree/view/ConsoleFamilyTreeView.java
new file mode 100644
index 0000000..495e8bc
--- /dev/null
+++ b/src/main/java/familytree/view/ConsoleFamilyTreeView.java
@@ -0,0 +1,74 @@
+package familytree.view;
+
+import familytree.model.Person;
+import java.util.List;
+import java.util.Scanner;
+
+public class ConsoleFamilyTreeView implements FamilyTreeView {
+ private Scanner scanner;
+
+ public ConsoleFamilyTreeView() {
+ this.scanner = new Scanner(System.in, "UTF-8");
+ }
+
+ @Override
+ public void displayMenu() {
+ System.out.println("\nВыберите действие:");
+ System.out.println("1. Добавить человека");
+ System.out.println("2. Найти человека");
+ System.out.println("3. Показать всех членов семьи");
+ System.out.println("4. Сортировать по имени");
+ System.out.println("5. Сортировать по дате рождения");
+ System.out.println("6. Сохранить дерево в файл");
+ System.out.println("7. Загрузить дерево из файла");
+ System.out.println("0. Выйти");
+ }
+
+ @Override
+ public void displayExtendedMenu() {
+ System.out.println("\nВыберите действие:");
+ System.out.println("1. Добавить человека");
+ System.out.println("2. Найти человека");
+ System.out.println("3. Показать всех членов семьи");
+ System.out.println("4. Сортировать по имени");
+ System.out.println("5. Сортировать по дате рождения");
+ System.out.println("6. Сохранить дерево в файл");
+ System.out.println("7. Загрузить дерево из файла");
+ System.out.println("8. Добавить отношение родитель-ребенок");
+ System.out.println("9. Показать детей");
+ System.out.println("10. Показать родителей");
+ System.out.println("11. Показать братьев/сестер");
+ System.out.println("12. Показать предков");
+ System.out.println("13. Показать потомков");
+ System.out.println("14. Показать количество поколений");
+ System.out.println("0. Выйти");
+ }
+
+ @Override
+ public int getMenuChoice() {
+ return Integer.parseInt(scanner.nextLine());
+ }
+
+ @Override
+ public String getInput(String prompt) {
+ System.out.print(prompt);
+ return scanner.nextLine();
+ }
+
+ @Override
+ public void displayMessage(String message) {
+ System.out.println(message);
+ }
+
+ @Override
+ public void displayPerson(Person person) {
+ System.out.println(person);
+ }
+
+ @Override
+ public void displayPersonList(List people) {
+ for (Person person : people) {
+ System.out.println(person);
+ }
+ }
+}
\ No newline at end of file
diff --git a/src/main/java/familytree/view/FamilyTreeView.java b/src/main/java/familytree/view/FamilyTreeView.java
new file mode 100644
index 0000000..6094220
--- /dev/null
+++ b/src/main/java/familytree/view/FamilyTreeView.java
@@ -0,0 +1,5 @@
+package familytree.view;
+
+public interface FamilyTreeView extends InputView, OutputView {
+ void displayExtendedMenu();
+}
\ No newline at end of file
diff --git a/src/main/java/familytree/view/InputView.java b/src/main/java/familytree/view/InputView.java
new file mode 100644
index 0000000..855f42d
--- /dev/null
+++ b/src/main/java/familytree/view/InputView.java
@@ -0,0 +1,6 @@
+package familytree.view;
+
+public interface InputView {
+ int getMenuChoice();
+ String getInput(String prompt);
+}
diff --git a/src/main/java/familytree/view/OutputView.java b/src/main/java/familytree/view/OutputView.java
new file mode 100644
index 0000000..47a76fa
--- /dev/null
+++ b/src/main/java/familytree/view/OutputView.java
@@ -0,0 +1,11 @@
+package familytree.view;
+
+import familytree.model.Person;
+import java.util.List;
+
+public interface OutputView {
+ void displayMenu();
+ void displayMessage(String message);
+ void displayPerson(Person person);
+ void displayPersonList(List people);
+}
\ No newline at end of file
diff --git a/src/ru/gb/vending_machine/Main.java b/src/ru/gb/vending_machine/Main.java
deleted file mode 100644
index abfd7ac..0000000
--- a/src/ru/gb/vending_machine/Main.java
+++ /dev/null
@@ -1,19 +0,0 @@
-package ru.gb.vending_machine;
-
-import ru.gb.vending_machine.products.Bottle;
-import ru.gb.vending_machine.products.Product;
-import ru.gb.vending_machine.vending.VendingMachine;
-
-public class Main {
- public static void main(String[] args) {
- VendingMachine vendingMachine = new VendingMachine(123);
-
- Product product1 = new Bottle("coca-cola", 150, 1.5);
- Product product2 = new Product("milko", 100);
-
- vendingMachine.addProduct(product1);
- vendingMachine.addProduct(product2);
-
- System.out.println(vendingMachine.getProductsInfo());
- }
-}
diff --git a/src/ru/gb/vending_machine/products/Bottle.java b/src/ru/gb/vending_machine/products/Bottle.java
deleted file mode 100644
index 6c657de..0000000
--- a/src/ru/gb/vending_machine/products/Bottle.java
+++ /dev/null
@@ -1,19 +0,0 @@
-package ru.gb.vending_machine.products;
-
-public class Bottle extends Product {
- private double volume;
-
- public Bottle(String name, double price, double volume) {
- super(name, price);
- this.volume = volume;
- }
-
- public double getVolume() {
- return volume;
- }
-
- @Override
- public String toString() {
- return super.toString() + ", volume: " + volume + "л.";
- }
-}
diff --git a/src/ru/gb/vending_machine/products/Product.java b/src/ru/gb/vending_machine/products/Product.java
deleted file mode 100644
index 2fbd604..0000000
--- a/src/ru/gb/vending_machine/products/Product.java
+++ /dev/null
@@ -1,37 +0,0 @@
-package ru.gb.vending_machine.products;
-
-public class Product {
- private int id;
- private String name;
- private double price;
-
- public Product(String name, double price) {
- this.name = name;
- this.price = price;
- }
-
- public int getId() {
- return id;
- }
-
- public void setId(int id) {
- this.id = id;
- }
-
- public String getName() {
- return name;
- }
-
- public double getPrice() {
- return price;
- }
-
- public void setPrice(double price) {
- this.price = price;
- }
-
- @Override
- public String toString() {
- return "id: " + id + ", name: " + name + ", price: " + price + "р.";
- }
-}
diff --git a/src/ru/gb/vending_machine/vending/VendingMachine.java b/src/ru/gb/vending_machine/vending/VendingMachine.java
deleted file mode 100644
index 01a63ca..0000000
--- a/src/ru/gb/vending_machine/vending/VendingMachine.java
+++ /dev/null
@@ -1,32 +0,0 @@
-package ru.gb.vending_machine.vending;
-
-import ru.gb.vending_machine.products.Product;
-
-import java.util.ArrayList;
-import java.util.List;
-
-public class VendingMachine {
- private int id;
- private int productId;
- private List productList;
-
- public VendingMachine(int id) {
- this.id = id;
- productList = new ArrayList<>();
- }
-
- public void addProduct(Product product){
- product.setId(productId++);
- productList.add(product);
- }
-
- public String getProductsInfo(){
- StringBuilder stringBuilder = new StringBuilder();
- stringBuilder.append("Список продуктов:\n");
- for (Product product: productList){
- stringBuilder.append(product);
- stringBuilder.append("\n");
- }
- return stringBuilder.toString();
- }
-}