티스토리 뷰
여러 패턴이 함께 사요이되는 형태를 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