Witaj,
dzisiaj chciałbym opisać wzorzec Controller.
Jeżeli nie widziałeś poprzednich postów w serii, to zapraszam do obejrzenia poprzedniego postu tutaj: https://steemit.com/polish/@grzegorz2047/wzorce-projektowe-i-zasady-poznanie-zasady-prawo-demeter-law-of-demeter
Co określa wzorzec Controller?
Wzorzec Controller mówi, że posiadając interfejs użytkownika, potrzebujemy klasy pośredniczącej pomiędzy interfejsem a przetwarzaniem danych w domenie programu.
A tak po ludzku?
Potrzebujemy klasę łączącą interfejs użytkownika z klasą/klasami przetwarzającymi dane.
Jaki jest tego cel?
Taki, żeby nie implementować logiki biznesowej, w programie, po stronie interfejsu użytkownika. Stosując wzorzec kontroler, możemy posiadać wiele interfejsów, np:
- graficzny
- konsolowy
Takie interfejsy przekazywałyby, przez klasę kontrolera, dane uzyskane od użytkownika. Natomiast kontroler, przekazywałby te dane do logiki programu, gdzie dane zostają przetwarzanie.
To tyle z teorii. To teraz jak tego użyć w praktyce?
Będziemy musieli podzielić program na dział interfejsu użytkownika, miejsce z kontrollerami oraz miejsce przetwarzania danych.
Dla naszego przykładu użyjemy interfejs konsolowy, aby uprościć zasadę działania wzorca. (I skrócić moją pracę xd)
Tak wygłąda nasza główna klasa:
public class Main {
public static void main(String[] args) {
ProcessData processData = new ProcessData();
SimpleUIController uiController = new SimpleUIController();
uiController.run(processData);
}
}
Tak wygląda nasz kontroler:
public class SimpleUIController {
public void run(ProcessData processData) {
SimpleUI simpleUI = new SimpleUI();
simpleUI.printText("Podaj jakies zdanie:");
String userValue = simpleUI.getUserValue();
simpleUI.printText("Podana wartość: " + userValue);
String output = processData.proccessUserInput(userValue);
simpleUI.printText(output);
}
}
Tak wygląda interfejs konsolowy:
import java.util.Scanner;
public class SimpleUI {
public void printText(String text) {
System.out.println(text);
}
public String getUserValue() {
Scanner reader = new Scanner(System.in);
return reader.nextLine();
}
}
A tak wygląda klasa przetwarzająca dane od użytkownika:
public class ProcessData {
public String proccessUserInput(String userValue) {
String[] split = userValue.split(" ");
return "Twoje zdanie sklada sie z " + split.length + " wyrazow!";
}
}
Przykładowe działanie programu:
Podaj jakies zdanie:Grzegorz jest super!
Podana wartość: Grzegorz jest super!
Twoje zdanie sklada sie z 3 wyrazow!
Jak widzicie, każda warstwa jest od siebie oddzielona. Kontroler jest tym, co przekazuje dane do innej części kodu.
Jeżeli macie pytania związane z tym wzorcem lub znaleźliście jakiś błąd, napiszcie w sekcji komentarzy.