refactor: separate collection state from UI navigation
This commit is contained in:
@@ -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("Создание новой коллекции");
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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("Сортировка текущей коллекции");
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user