티스토리 뷰

Paradigm/OOP

[OOP] MVC패턴익히기

Mr.SIM 2013. 6. 6. 11:53

여러 패턴이 함께 사요이되는 형태를 Compound패턴이라고 한다. 이 중 가장 대표적인 MVC(Model, View, Controller)패턴에 대해 알아보자.


MVC패턴은 모델과 뷰를 분리하고 그 사이에 제어를 하는 Controller를 두는 형태이다.

 모델 : 응용의 데이터와 데이터를 조작하기 위한 규칙이 구현됨 

     : 외부로 보여지는 부분

 컨트롤러 : 모델의 변





위 이미지 처럼 사람이 보는 쪽은 View이며, 리모컨으로 컨트롤 해준다. 실제 MP3의 경우는 View이면서 Controller이기도 하다.


다른 패턴과의 사용

원격 프록시 패턴 : 뷰와 모델관계를 클라이언트-서버 모델로 쉽게 확장 가능하다.

Composite 패턴   : Controller는 오직 가장 상위 Component에게만 update요청을 하며, 나머지는 composite패턴을 통 해 처리한다.

전략 패턴 : 뷰는 컨트롤러에게 사용자 행위를 처리하도록 위임한다. (뷰는 컨트롤러를 전략으로 처리 가능)

옵저버 패턴 : 뷰뷰는 상태변화를 통보받아야 하며, 이 때문에 보통 Observer가 된다.



장점 : 세 가지 요소로 구분하기 때문에 서로 고립하여 구현될 수 있다. 또한, 확장(뷰 추가) 및 변경이 용이하다.



예제)  옵저버패턴의 이용


Observer

public interface Observer {
      void update(int data);
}




Model

public class CalculatorModel{

	private int data;
	private ArrayList<Observer> list = new ArrayList<Observer>();

	public void addTwoNumber(int firstNumber, int secondNumber) {
		data = firstNumber + secondNumber;
		notifyObservers();
	}

	public void registerObserver(Observer o) {
		list.add(o);
	}

	public void notifyObservers() {
		for (Observer o : list) {
			o.update(data);
		}
	}
}



View

public class CalculatorView extends JFrame implements Observer{

	private JTextField firstNumber = new JTextField(10);
	private JLabel additionLabel = new JLabel("+");
	private JTextField secondNumber = new JTextField(10);
	private JButton calculateButton = new JButton("계산");
	private JTextField calcSolution = new JTextField(10);
	private JPanel calcPanel = new JPanel();

	public CalculatorView() {
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		setSize(600, 200);
		setLayout(new BorderLayout());
		calcPanel.add(firstNumber);
		calcPanel.add(additionLabel);
		calcPanel.add(secondNumber);
		calcPanel.add(calculateButton);
		calcPanel.add(calcSolution);
		add(calcPanel, BorderLayout.CENTER);
	}

	public int getFirstNumber() {
		return Integer.parseInt(firstNumber.getText());
	}

	public int getSecondNumber() {
		return Integer.parseInt(secondNumber.getText());
	}

	public void setCalcSolution(int result) {
		calcSolution.setText(result +"");
	}
	
	public void setCalculatorListener(ActionListener listener){
		calculateButton.addActionListener(listener);
	}

	@Override
	public void update(int data) {
		setCalcSolution(data);
	}
}


Controller

public class CalculatorController implements ActionListener {

	private CalculatorModel model;
	private CalculatorView view;

	public CalculatorController(CalculatorModel model, CalculatorView view) {
		this.model = model;
		this.view = view;
		this.view.setCalculatorListener(this);
	}

	@Override
	public void actionPerformed(ActionEvent arg0) {
		// TODO Auto-generated method stub

		try {
			int firstNumber = view.getFirstNumber();
			int secondNumber = view.getSecondNumber();
			model.addTwoNumber(firstNumber, secondNumber);

		} catch (RuntimeException e) {

		}
	}
} 




TEST

public class test {
	public static void main(String[] args) {
		CalculatorView view = new CalculatorView();
		CalculatorModel model = new CalculatorModel();
		model.registerObserver(view);
		CalculatorController controller = new CalculatorController(model, view);
		view.setVisible(true);
	}

}



'Paradigm > OOP' 카테고리의 다른 글

[OOP] 객제지향, 디자인 원리  (0) 2013.09.27
[OOP] SRP 확인하기  (0) 2013.09.27
[OOP] StatePattern  (0) 2013.05.28
[OOP] TemplatePattern  (0) 2013.05.13
[OOP] AdapterPattern  (0) 2013.05.10
댓글
최근에 올라온 글
최근에 달린 댓글
글 보관함
Total
Today
Yesterday