Prof. Dr. A. Poetzsch-Heffter Dipl.-Inform. N. Rauch Technische Universität Kaiserslautern Fachbereich Informatik AG Softwaretechnik Lösungsvorschläge zum Übungsblatt 12: Fortgeschrittene Aspekte objektorientierter Programmierung (SS 2007) Aufgabe 1 Das Model-View-Controller Pattern a) Eine MVC-basierte Version könnte wie folgt aussehen. import java.awt.event.*; import javax.swing.*; import java.util.*; public class MyApplicationMVC { public MyApplicationMVC() { MyModel m=new MyModel(); MyController c=new MyController(m); new MyView(c,m); new MyView(c,m); new MyView2(c,m); } public static void main(String ... args) { new MyApplicationMVC(); } } class MyModel extends Observable { private int myValue=-1; @Override public void addObserver(Observer observer) { super.addObserver(observer); increment(); } public int getValue() { return(myValue); } public void increment() { setChanged(); notifyObservers(++myValue); } } class MyView extends JFrame implements Observer { private JButton button; public MyView(MyController target, MyModel observable) { button = new JButton(); this.add(button); button.addActionListener(target); observable.addObserver(this); setVisible(true); } public void update(Observable o, Object arg) { button.setText(arg.toString()); } } class MyView2 extends JFrame implements Observer { private JLabel label; public MyView2(MyController target, MyModel observable) { label = new JLabel(); this.add(label); observable.addObserver(this); setVisible(true); } public void update(Observable o, Object arg) { label.setText(arg.toString()); } } class MyController implements ActionListener { private MyModel myModel; public MyController(MyModel myModel) { this.myModel=myModel; } public void actionPerformed(ActionEvent Event) { myModel.increment(); } } b) Die ursprüngliche Version besitzt keine Nutzungsschnittstelle; die Nutzungsschnittstelle der MVC-basierten Applikation ist die Schnittstelle der MVC-Klassen. c) Eine Erweiterung der ursprünglichen Applikation könnte so aussehen: import java.awt.event.*; import javax.swing.*; public class MyApplication2 extends JFrame implements ActionListener { private JButton myButton=new JButton("0"); private JFrame myFrame = new JFrame(); private JLabel myLabel = new JLabel(); public MyApplication2() { add(myButton); myButton.addActionListener(this); myFrame.add(myLabel); setVisible(true); myFrame.setVisible(true); } public void actionPerformed(ActionEvent Event) { String label = Integer.toString(Integer.parseInt(myButton.getText())+1); myButton.setText(label); myLabel.setText(label); } public static void main(String ... args) { new MyApplication2(); } } Es ist deutlich zu sehen, dass eine solche Erweiterung mit dem MVC-Pattern wesentlich klarer und strukturierter vonstatten geht. Auch wenn weitere View-Instanzen zugefügt werden sollen, ist dies im MVC-Pattern leichter möglich. 2