refactor: separate collection state from UI navigation
This commit is contained in:
@@ -21,9 +21,18 @@ public final class App {
|
|||||||
try {
|
try {
|
||||||
MultiWindowTextGUI gui = new MultiWindowTextGUI(screen);
|
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));
|
gui.addWindowAndWait(new MainMenu(navigator));
|
||||||
|
|
||||||
} finally {
|
} finally {
|
||||||
screen.stopScreen();
|
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;
|
package ru.project.ui;
|
||||||
|
|
||||||
|
import ru.project.CollectionController;
|
||||||
|
|
||||||
public class CollectionView extends EmptyMenu {
|
public class CollectionView extends EmptyMenu {
|
||||||
|
|
||||||
public CollectionView() {
|
public CollectionView(CollectionController controller) {
|
||||||
super("Текущая коллекция");
|
super("Текущая коллекция");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,8 +1,10 @@
|
|||||||
package ru.project.ui;
|
package ru.project.ui;
|
||||||
|
|
||||||
|
import ru.project.CollectionController;
|
||||||
|
|
||||||
public class CountOccurrencesMenu extends EmptyMenu {
|
public class CountOccurrencesMenu extends EmptyMenu {
|
||||||
|
|
||||||
public CountOccurrencesMenu() {
|
public CountOccurrencesMenu(CollectionController controller) {
|
||||||
super("Подсчёт количества вхождений");
|
super("Подсчёт количества вхождений");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,8 +1,10 @@
|
|||||||
package ru.project.ui;
|
package ru.project.ui;
|
||||||
|
|
||||||
|
import ru.project.CollectionController;
|
||||||
|
|
||||||
public class CreateCollectionMenu extends EmptyMenu {
|
public class CreateCollectionMenu extends EmptyMenu {
|
||||||
|
|
||||||
public CreateCollectionMenu() {
|
public CreateCollectionMenu(CollectionController controller) {
|
||||||
super("Создание новой коллекции");
|
super("Создание новой коллекции");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -2,13 +2,16 @@ package ru.project.ui;
|
|||||||
|
|
||||||
import com.googlecode.lanterna.gui2.BasicWindow;
|
import com.googlecode.lanterna.gui2.BasicWindow;
|
||||||
import com.googlecode.lanterna.gui2.WindowBasedTextGUI;
|
import com.googlecode.lanterna.gui2.WindowBasedTextGUI;
|
||||||
|
import ru.project.CollectionController;
|
||||||
|
|
||||||
public class Navigator {
|
public class Navigator {
|
||||||
|
|
||||||
private final WindowBasedTextGUI gui;
|
private final WindowBasedTextGUI gui;
|
||||||
|
private final CollectionController collectionController;
|
||||||
|
|
||||||
public Navigator(WindowBasedTextGUI gui) {
|
public Navigator(WindowBasedTextGUI gui, CollectionController collectionController) {
|
||||||
this.gui = gui;
|
this.gui = gui;
|
||||||
|
this.collectionController = collectionController;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void show(BasicWindow window) {
|
public void show(BasicWindow window) {
|
||||||
@@ -16,26 +19,26 @@ public class Navigator {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public void showCollectionView() {
|
public void showCollectionView() {
|
||||||
show(new CollectionView());
|
show(new CollectionView(collectionController));
|
||||||
}
|
}
|
||||||
|
|
||||||
public void showCreateCollection() {
|
public void showCreateCollection() {
|
||||||
show(new CreateCollectionMenu());
|
show(new CreateCollectionMenu(collectionController));
|
||||||
}
|
}
|
||||||
|
|
||||||
public void showSaveCollection() {
|
public void showSaveCollection() {
|
||||||
show(new SaveCollectionMenu());
|
show(new SaveCollectionMenu(collectionController));
|
||||||
}
|
}
|
||||||
|
|
||||||
public void showSortCollection() {
|
public void showSortCollection() {
|
||||||
show(new SortCollectionMenu());
|
show(new SortCollectionMenu(collectionController));
|
||||||
}
|
}
|
||||||
|
|
||||||
public void showSearchElement() {
|
public void showSearchElement() {
|
||||||
show(new SearchElementMenu());
|
show(new SearchElementMenu(collectionController));
|
||||||
}
|
}
|
||||||
|
|
||||||
public void showCountOccurrences() {
|
public void showCountOccurrences() {
|
||||||
show(new CountOccurrencesMenu());
|
show(new CountOccurrencesMenu(collectionController));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,8 +1,10 @@
|
|||||||
package ru.project.ui;
|
package ru.project.ui;
|
||||||
|
|
||||||
|
import ru.project.CollectionController;
|
||||||
|
|
||||||
public class SaveCollectionMenu extends EmptyMenu {
|
public class SaveCollectionMenu extends EmptyMenu {
|
||||||
|
|
||||||
public SaveCollectionMenu() {
|
public SaveCollectionMenu(CollectionController controller) {
|
||||||
super("Сохранение текущей коллекции");
|
super("Сохранение текущей коллекции");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,8 +1,10 @@
|
|||||||
package ru.project.ui;
|
package ru.project.ui;
|
||||||
|
|
||||||
|
import ru.project.CollectionController;
|
||||||
|
|
||||||
public class SearchElementMenu extends EmptyMenu {
|
public class SearchElementMenu extends EmptyMenu {
|
||||||
|
|
||||||
public SearchElementMenu() {
|
public SearchElementMenu(CollectionController controller) {
|
||||||
super("Поиск элемента");
|
super("Поиск элемента");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,8 +1,10 @@
|
|||||||
package ru.project.ui;
|
package ru.project.ui;
|
||||||
|
|
||||||
|
import ru.project.CollectionController;
|
||||||
|
|
||||||
public class SortCollectionMenu extends EmptyMenu {
|
public class SortCollectionMenu extends EmptyMenu {
|
||||||
|
|
||||||
public SortCollectionMenu() {
|
public SortCollectionMenu(CollectionController controller) {
|
||||||
super("Сортировка текущей коллекции");
|
super("Сортировка текущей коллекции");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user