<aside> ❓

MVC는 어플리케이션의 사용자 인터페이스, 비즈니스 로직, 데이터의 세 가지 주요 구성 요소를 분리하여 각 요소가 서로에게 미치는 영향을 최소화하기 위한 목적을 가지는 소프트웨어 디자인 패턴

</aside>

작동원리

  1. 사용자는 Controller를 통해 어플리케이션과 상호 작용한다.
  2. Controller는 사용자의 요청을 해석하고, 필요한 데이터를 Model에 요청한다.
  3. Model은 요청된 데이터를 처리하고, 결과를 Controller에 반환한다.
  4. Controller는 반환 된 데이터를 View에 전달하여 사용자에게 알맞게 표시한다.
  5. 사용자는 업데이트 된 View를 보게 된다.

장점

  1. 관심사의 분리
  2. 유연성
  3. 재사용성

예시

// Model
class GameModel {
    private int targetNumber;
    
    public GameModel() {
        this.targetNumber = (int) (Math.random() * 10) + 1;
    }

    public int getTargetNumber() {
        return targetNumber;
    }
}

// Service
class GameService {
    private GameModel model;

    public GameService(GameModel model) {
        this.model = model;
    }

    public boolean isGuessCorrect(int guess) {
        return guess == model.getTargetNumber();
    }

    public String provideHint(int guess) {
        if (guess > model.getTargetNumber()) {
            return "더 낮은 숫자를 시도해보세요!";
        } else {
            return "더 높은 숫자를 시도해보세요!";
        }
    }
}

// View
class GameView {
    public int getUserInput() {
        Scanner scanner = new Scanner(System.in);
        System.out.print("1부터 10까지의 숫자 중 하나를 입력하세요: ");
        return scanner.nextInt();
    }

    public void displayResult(boolean isCorrect) {
        if (isCorrect) {
            System.out.println("정답입니다!");
        } else {
            System.out.println("틀렸습니다. 다시 시도하세요.");
        }
    }

    public void displayHint(String hint) {
        System.out.println(hint);
    }
}
// Controller
class GameController {
    private GameService service;
    private GameView view;

    public GameController(GameService service, GameView view) {
        this.service = service;
        this.view = view;
    }

    public void play() {
        while (true) {
            int userGuess = view.getUserInput();
            if (service.isGuessCorrect(userGuess)) {
                view.displayResult(true);
                break;
            } else {
                view.displayResult(false);
                view.displayHint(service.provideHint(userGuess));
            }
        }
    }
}

// Main
public class NumberGuessingGame {
    public static void main(String[] args) {
        GameModel model = new GameModel();
        GameService service = new GameService(model);
        GameView view = new GameView();
        GameController controller = new GameController(service, view);

        controller.play();
    }
}