Wzorce projektowe i zasady #6 - omówienie wzorca Controller zawartego w GRASP

in polish •  7 years ago  (edited)

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.
Authors get paid when people like you upvote their post.
If you enjoyed what you read here, create your account today and start earning FREE STEEM!