From 2a3700b6c4abf0ce9d02d1d5f7b1084a2fddb572 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=92=D0=BE=D0=BB=D0=BE=D0=B4=D0=B8=D0=BD=20=D0=93=D0=B5?= =?UTF-8?q?=D1=80=D0=BC=D0=B0=D0=BD?= Date: Wed, 26 Aug 2026 12:36:38 +0400 Subject: [PATCH] refactor: separate collection state from UI navigation --- app/src/main/java/ru/project/App.java | 11 ++++- app/src/main/java/ru/project/AppState.java | 18 +++++++ .../java/ru/project/CollectionController.java | 49 +++++++++++++++++++ .../main/java/ru/project/DataCollection.java | 47 ++++++++++++++++++ .../java/ru/project/ui/CollectionView.java | 4 +- .../ru/project/ui/CountOccurrencesMenu.java | 4 +- .../ru/project/ui/CreateCollectionMenu.java | 4 +- .../main/java/ru/project/ui/Navigator.java | 17 ++++--- .../ru/project/ui/SaveCollectionMenu.java | 4 +- .../java/ru/project/ui/SearchElementMenu.java | 4 +- .../ru/project/ui/SortCollectionMenu.java | 4 +- 11 files changed, 152 insertions(+), 14 deletions(-) create mode 100644 app/src/main/java/ru/project/AppState.java create mode 100644 app/src/main/java/ru/project/CollectionController.java create mode 100644 app/src/main/java/ru/project/DataCollection.java diff --git a/app/src/main/java/ru/project/App.java b/app/src/main/java/ru/project/App.java index bf57afc..646773c 100644 --- a/app/src/main/java/ru/project/App.java +++ b/app/src/main/java/ru/project/App.java @@ -21,9 +21,18 @@ public final class App { try { MultiWindowTextGUI gui = new MultiWindowTextGUI(screen); - Navigator navigator = new Navigator(gui); + // Application state + AppState state = new AppState(); + // Controllers + CollectionController collectionController = new CollectionController(state); + + // Navigation + Navigator navigator = new Navigator(gui, collectionController); + + // Application entry point gui.addWindowAndWait(new MainMenu(navigator)); + } finally { screen.stopScreen(); } diff --git a/app/src/main/java/ru/project/AppState.java b/app/src/main/java/ru/project/AppState.java new file mode 100644 index 0000000..144f857 --- /dev/null +++ b/app/src/main/java/ru/project/AppState.java @@ -0,0 +1,18 @@ +package ru.project; + +public class AppState { + + private DataCollection collection; + + public DataCollection getCollection() { + return collection; + } + + public void setCollection(DataCollection collection) { + this.collection = collection; + } + + public boolean hasCollection() { + return collection != null; + } +} diff --git a/app/src/main/java/ru/project/CollectionController.java b/app/src/main/java/ru/project/CollectionController.java new file mode 100644 index 0000000..8cf3deb --- /dev/null +++ b/app/src/main/java/ru/project/CollectionController.java @@ -0,0 +1,49 @@ +package ru.project; + +public class CollectionController { + + private final AppState state; + + public CollectionController(AppState state) { + this.state = state; + } + + public void createCollection() { + DataCollection collection = new DataCollection(); + + collection.add("Charlie"); + collection.add("Alice"); + collection.add("Bob"); + collection.add("Alice"); + + state.setCollection(collection); + } + + public DataCollection getCollection() { + return state.getCollection(); + } + + public boolean hasCollection() { + return state.hasCollection(); + } + + public void sortCollection() { + if (!state.hasCollection()) { + return; + } + + state.getCollection().sort(); + } + + public boolean contains(String element) { + return state.hasCollection() && state.getCollection().contains(element); + } + + public int countOccurrences(String element) { + if (!state.hasCollection()) { + return 0; + } + + return state.getCollection().count(element); + } +} diff --git a/app/src/main/java/ru/project/DataCollection.java b/app/src/main/java/ru/project/DataCollection.java new file mode 100644 index 0000000..bd5553a --- /dev/null +++ b/app/src/main/java/ru/project/DataCollection.java @@ -0,0 +1,47 @@ +package ru.project; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; + +public class DataCollection { + + private final List elements = new ArrayList<>(); + + public void add(String element) { + elements.add(element); + } + + public void sort() { + Collections.sort(elements); + } + + public boolean contains(String element) { + return elements.contains(element); + } + + public int count(String element) { + int count = 0; + + for (String current : elements) { + if (current.equals(element)) { + count++; + } + } + + return count; + } + + public List getElements() { + return Collections.unmodifiableList(elements); + } + + @Override + public String toString() { + if (elements.isEmpty()) { + return "Коллекция пуста"; + } + + return String.join(", ", elements); + } +} diff --git a/app/src/main/java/ru/project/ui/CollectionView.java b/app/src/main/java/ru/project/ui/CollectionView.java index 82b9540..ddad8cc 100644 --- a/app/src/main/java/ru/project/ui/CollectionView.java +++ b/app/src/main/java/ru/project/ui/CollectionView.java @@ -1,8 +1,10 @@ package ru.project.ui; +import ru.project.CollectionController; + public class CollectionView extends EmptyMenu { - public CollectionView() { + public CollectionView(CollectionController controller) { super("Текущая коллекция"); } } diff --git a/app/src/main/java/ru/project/ui/CountOccurrencesMenu.java b/app/src/main/java/ru/project/ui/CountOccurrencesMenu.java index db8e0c8..5ef70e5 100644 --- a/app/src/main/java/ru/project/ui/CountOccurrencesMenu.java +++ b/app/src/main/java/ru/project/ui/CountOccurrencesMenu.java @@ -1,8 +1,10 @@ package ru.project.ui; +import ru.project.CollectionController; + public class CountOccurrencesMenu extends EmptyMenu { - public CountOccurrencesMenu() { + public CountOccurrencesMenu(CollectionController controller) { super("Подсчёт количества вхождений"); } } diff --git a/app/src/main/java/ru/project/ui/CreateCollectionMenu.java b/app/src/main/java/ru/project/ui/CreateCollectionMenu.java index 6ea56fc..69cfd2d 100644 --- a/app/src/main/java/ru/project/ui/CreateCollectionMenu.java +++ b/app/src/main/java/ru/project/ui/CreateCollectionMenu.java @@ -1,8 +1,10 @@ package ru.project.ui; +import ru.project.CollectionController; + public class CreateCollectionMenu extends EmptyMenu { - public CreateCollectionMenu() { + public CreateCollectionMenu(CollectionController controller) { super("Создание новой коллекции"); } } diff --git a/app/src/main/java/ru/project/ui/Navigator.java b/app/src/main/java/ru/project/ui/Navigator.java index 13489c1..873a1a4 100644 --- a/app/src/main/java/ru/project/ui/Navigator.java +++ b/app/src/main/java/ru/project/ui/Navigator.java @@ -2,13 +2,16 @@ package ru.project.ui; import com.googlecode.lanterna.gui2.BasicWindow; import com.googlecode.lanterna.gui2.WindowBasedTextGUI; +import ru.project.CollectionController; public class Navigator { private final WindowBasedTextGUI gui; + private final CollectionController collectionController; - public Navigator(WindowBasedTextGUI gui) { + public Navigator(WindowBasedTextGUI gui, CollectionController collectionController) { this.gui = gui; + this.collectionController = collectionController; } public void show(BasicWindow window) { @@ -16,26 +19,26 @@ public class Navigator { } public void showCollectionView() { - show(new CollectionView()); + show(new CollectionView(collectionController)); } public void showCreateCollection() { - show(new CreateCollectionMenu()); + show(new CreateCollectionMenu(collectionController)); } public void showSaveCollection() { - show(new SaveCollectionMenu()); + show(new SaveCollectionMenu(collectionController)); } public void showSortCollection() { - show(new SortCollectionMenu()); + show(new SortCollectionMenu(collectionController)); } public void showSearchElement() { - show(new SearchElementMenu()); + show(new SearchElementMenu(collectionController)); } public void showCountOccurrences() { - show(new CountOccurrencesMenu()); + show(new CountOccurrencesMenu(collectionController)); } } diff --git a/app/src/main/java/ru/project/ui/SaveCollectionMenu.java b/app/src/main/java/ru/project/ui/SaveCollectionMenu.java index cc0f36a..9f7d2e4 100644 --- a/app/src/main/java/ru/project/ui/SaveCollectionMenu.java +++ b/app/src/main/java/ru/project/ui/SaveCollectionMenu.java @@ -1,8 +1,10 @@ package ru.project.ui; +import ru.project.CollectionController; + public class SaveCollectionMenu extends EmptyMenu { - public SaveCollectionMenu() { + public SaveCollectionMenu(CollectionController controller) { super("Сохранение текущей коллекции"); } } diff --git a/app/src/main/java/ru/project/ui/SearchElementMenu.java b/app/src/main/java/ru/project/ui/SearchElementMenu.java index 7e92c4f..b185219 100644 --- a/app/src/main/java/ru/project/ui/SearchElementMenu.java +++ b/app/src/main/java/ru/project/ui/SearchElementMenu.java @@ -1,8 +1,10 @@ package ru.project.ui; +import ru.project.CollectionController; + public class SearchElementMenu extends EmptyMenu { - public SearchElementMenu() { + public SearchElementMenu(CollectionController controller) { super("Поиск элемента"); } } diff --git a/app/src/main/java/ru/project/ui/SortCollectionMenu.java b/app/src/main/java/ru/project/ui/SortCollectionMenu.java index 68e6a7a..99bc1a8 100644 --- a/app/src/main/java/ru/project/ui/SortCollectionMenu.java +++ b/app/src/main/java/ru/project/ui/SortCollectionMenu.java @@ -1,8 +1,10 @@ package ru.project.ui; +import ru.project.CollectionController; + public class SortCollectionMenu extends EmptyMenu { - public SortCollectionMenu() { + public SortCollectionMenu(CollectionController controller) { super("Сортировка текущей коллекции"); } }