refactor: separate collection state from UI navigation

This commit is contained in:
2026-08-26 12:36:38 +04:00
parent a139fa10c6
commit 2a3700b6c4
11 changed files with 152 additions and 14 deletions
+10 -1
View File
@@ -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();
}
@@ -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;
}
}
@@ -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);
}
}
@@ -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<String> 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<String> getElements() {
return Collections.unmodifiableList(elements);
}
@Override
public String toString() {
if (elements.isEmpty()) {
return "Коллекция пуста";
}
return String.join(", ", elements);
}
}
@@ -1,8 +1,10 @@
package ru.project.ui;
import ru.project.CollectionController;
public class CollectionView extends EmptyMenu {
public CollectionView() {
public CollectionView(CollectionController controller) {
super("Текущая коллекция");
}
}
@@ -1,8 +1,10 @@
package ru.project.ui;
import ru.project.CollectionController;
public class CountOccurrencesMenu extends EmptyMenu {
public CountOccurrencesMenu() {
public CountOccurrencesMenu(CollectionController controller) {
super("Подсчёт количества вхождений");
}
}
@@ -1,8 +1,10 @@
package ru.project.ui;
import ru.project.CollectionController;
public class CreateCollectionMenu extends EmptyMenu {
public CreateCollectionMenu() {
public CreateCollectionMenu(CollectionController controller) {
super("Создание новой коллекции");
}
}
+10 -7
View File
@@ -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));
}
}
@@ -1,8 +1,10 @@
package ru.project.ui;
import ru.project.CollectionController;
public class SaveCollectionMenu extends EmptyMenu {
public SaveCollectionMenu() {
public SaveCollectionMenu(CollectionController controller) {
super("Сохранение текущей коллекции");
}
}
@@ -1,8 +1,10 @@
package ru.project.ui;
import ru.project.CollectionController;
public class SearchElementMenu extends EmptyMenu {
public SearchElementMenu() {
public SearchElementMenu(CollectionController controller) {
super("Поиск элемента");
}
}
@@ -1,8 +1,10 @@
package ru.project.ui;
import ru.project.CollectionController;
public class SortCollectionMenu extends EmptyMenu {
public SortCollectionMenu() {
public SortCollectionMenu(CollectionController controller) {
super("Сортировка текущей коллекции");
}
}