• No results found

Konzepte objektorientierter Programmierung

N/A
N/A
Protected

Academic year: 2021

Share "Konzepte objektorientierter Programmierung"

Copied!
30
0
0

Loading.... (view fulltext now)

Full text

(1)

Programmierung

Prof. Dr. Peter Müller

Werner Dietl

Software Component Technology

Wintersemester 05/06

Exercises 5: Frameworks

(2)

Homework 1 – Observer Pattern

From: Gamma, Helm, Johnson, Vlissides: “Design Patterns”

(3)

Java support for the Observer Pattern

Subject java.util.Observable

- void addObserver(Observer o)

- void setChanged()

- void notifyObservers(Object arg)

Observer java.util.Observer

- void update(Observable o, Object arg)

Events java.util.EventObject

- EventObject(Object source)

- Object getSource()

(4)

Events

abstract public class ChangeEvent

extends java.util.EventObject {

public ChangeEvent( Object source,

int v, int c ) {

super(source); value = v; change = c; }

public int getValue() { return value; }

public int getChange() { return change; }

private int value;

private int change;

}

(5)

Specialized Events

public class IncreaseEvent

extends ChangeEvent {

public IncreaseEvent(Object s,int v,int c) {

super(s, v, c);

}

}

public class DecreaseEvent

extends ChangeEvent {

public DecreaseEvent(Object s,int v,int c) {

super(s, v, c);

}

}

(6)

ActiveValue – Setup

public class ActiveValue

extends java.util.Observable {

private int myval;

public void run() {

int change;

Random crnd = new Random();

myval = 0;

while( true ) { … }

}

}

(7)

ActiveValue – Main Loop

while( true ) {

change = crnd.nextInt( 11 ) - 5;

myval += change;

sendEvent( change );

Thread.sleep( 1000 );

}

(8)

ActiveValue – Event Notification

public void sendEvent( int change ) {

java.util.EventObject e;

if( change >= 0 ) {

e = new IncreaseEvent(this,myval,change);

} else {

e = new DecreaseEvent(this,myval,change);

}

setChanged();

notifyObservers( e );

}

(9)

ActiveValue – Changing the Value

public void reset() {

setValue( 0 );

}

public void setValue( int value ) {

int change;

change = value - myval;

myval = value;

sendEvent( change );

}

(10)

Class Hierarchy so far

Observable Observer EventObject

ChangeEvent

DecreaseEvent IncreaseEvent

ActiveValue

(11)

SignChangeObserver

public class SignChangeObserver

implements java.util.Observer {

public void update( java.util.Observable s,

Object e ) {

if( !(e instanceof ChangeEvent)) return;

ChangeEvent ce = (ChangeEvent) e;

if( ce instanceof IncreaseEvent ) {

System.out.println("+");

} else {

System.out.println("-");

}

}

}

(12)

TextChangeObserver

public class TextChangeObserver

implements java.util.Observer {

public void update(Observable s, Object e) {

if( !(e instanceof ChangeEvent)) return;

ChangeEvent ce = (ChangeEvent) e;

if( ce instanceof IncreaseEvent ) {

System.out.print("++++ ");

} else {

System.out.print("---- ");

}

System.out.println("New Value: “+ce.getValue() +

" Change: “ + ce.getChange() );

}

}

(13)

TextMain

public class TextMain {

public static void main( String[] args ) {

ActiveValue v = new ActiveValue();

Observer o1 = new TextChangeObserver();

Observer o2 = new SignChangeObserver();

v.addObserver( o1 );

v.addObserver( o2 );

v.run();

}

}

(14)

Class Hierarchy

Observable

Observer EventObject

ChangeEvent

DecreaseEvent IncreaseEvent

ActiveValue

TextChangeObserver

SignChangeObserver

(15)

GuiMain – Adding a Graphical UI

public class GuiMain {

public static void main( String[] args ) {

ActiveValue v = new ActiveValue();

Observer o1 = new GuiChangeObserver();

Observer o2 = new GuiSignChangeObserver();

v.addObserver( o1 );

v.addObserver( o2 );

v.run();

}

}

(16)

GuiChangeObserver – Update

public class GuiChangeObserver

implements java.util.Observer {

public void update( Observable s, Event e ) {

if( ! (e instanceof ChangeEvent) ) return;

ChangeEvent ce = (ChangeEvent) e;

if( ce instanceof IncreaseEvent ) {

sign.setForeground( Color.RED );

sign.setText("++++");

} else { … }

value.setText("New Value: " + ce.getValue());

change.setText("Change: " + ce.getChange());

}

(17)

Adding Components

public Component createComponents() {

JPanel pane = new JPanel();

pane.setBorder(

BorderFactory.createEmptyBorder(

30, 30, // top, left

30, 30) // bottom, right

);

pane.setLayout(new GridLayout(0, 3));

pane.add(sign);

pane.add(value);

pane.add(change);

return pane;

}

(18)

Screenshot & Demo

(19)

View View

Model-View-Controller Architecture

View View

Model

(Application Interface)

Send events

Update view

Report

changes

Initiate

operation

Read

data

Report

changes

View

Controller

(20)

Adding a Simple Reset Controller

button = new JButton();

button.addActionListener(

new ActionListener() {

public void actionPerformed(

ActionEvent e) {

theValue.reset();

}

} );

pane.add(button, BorderLayout.CENTER);

(21)

Composite Pattern

From: Gamma, Helm, Johnson, Vlissides: “Design Patterns”

(22)

Composite Pattern in Swing

Used many times

Composite is called Container

java.lang.Object

java.awt.Component

java.awt.Container

javax.swing.JComponent

javax.swing.JPanel

(23)

Homework 2 – Factory Method Pattern

From: Gamma, Helm, Johnson, Vlissides: “Design Patterns”

(24)

Example Classes

Application

ImageDocument DrawingApplication

Document

(25)

Abstract Class Application

public abstract class Application {

public Application() {

documents = new ArrayList<Document>();

}

// the factory method!

protected abstract Document createDocument();

public void newDocument() {

Document toadd = createDocument();

documents.add( toadd );

toadd.open();

}

...

(26)

Interface Document

public interface Document {

void open();

void save();

void reload();

void close();

}

(27)

Class ImageDocument

public class ImageDocument

implements Document {

public void open() {

System.out.println("ImageDocument.open");

}

public void save() {

System.out.println("ImageDocument.save");

}

...

(28)

Class DrawingApplication

public class DrawingApplication

extends Application {

public DrawingApplication() { super(); }

// the overridden factory method returns

// a concrete object of type ImageDocument.

protected Document createDocument() {

return new ImageDocument(); }

public static void main( String[] args ) {

DrawingApplication appl =

new DrawingApplication();

appl.newDocument(); appl.newDocument();

appl.newDocument(); appl.saveAll();

appl.closeAll(); }

}

(29)

Example Classes

Application

ImageDocument DrawingApplication

Document

(30)

Questions?

References

Related documents

• “[C]laim” includes any request or demand, whether under a contract or otherwise, for money or property which is made to a contractor, grantee, or other recipient if the

Overall, these results suggest that even though the densities of contribution would be higher in periods with “normal” unemployment rates than in the period in which the work

• All registration data entered or updated in CTMS only • Mapping code lists for protocols sites and treatment arms Mapping code lists for protocols, sites and treatment arms •

LuAnn Volkmer, ARNP-C, Pediatric Care Mental Health Specialist, Blank Children’s Hospital Adolescent Clinic Stephen Wolfe, MD, Professor Emeritus, Department of Family

The only time musica mundana is evoked in the play is when Pericles is healed, so it seems clear that Shakespeare is supporting the idea that music can be used as a cure for

 Presence of cancer care infrastructure such as medical laboratory, ultrasound facilities, X-ray facilities, Radio- and chemo- therapy facilities, nuclear

The OpenStage 30T/40/40G/40T always requires a local power supply (SMPS mains adapter, must be ordered separately) if an OpenStage Busy Lamp Field 40 is connected.. The PNOTE

Climate change has the power to affect many ecological processes, but the most obvious changes ap- pear in the form of melting sea ice, sea level rise, changes in oceanic