Transcript תוכנה 1 תבנית העיצוב Observer שחר מעוז 1 בית הספר למדעי המחשב אוניברסיטת תל אביב
Slide 1
תוכנה 1
תבנית העיצוב Observer
שחר מעוז
1
בית הספר למדעי המחשב
אוניברסיטת תל אביב
Slide 2
2
תבניות עיצוב ()Design Patterns
• פתרונות כלליים לבעיות עיצוב שחוזרות על עצמן
• מגדירים שפה כללית יותר לדיון על עיצוב התכנית
• Factory, Singleton, Observerבמקום
"המחלקה Aיורשת מהמחלקה "B
• ספרDesign Patterns: Elements of :
Reusable Object-Oriented Software
• מידע רב בנושא קיים ברשת
• בקורס ראינו כבר מספר תבניות ,למשל
Factory, Bridge, Adapter, Template method
Slide 3
3
Different Views
60
50
60
40
50
30
40
30
Series1
Series1
10
10
0
1
2
3
2
3
20
20
0
1
1
2
Data
a=50
b=10
C=20
3
Slide 4
4
Different Views (cont.)
• When the data changes, all views should change
• Views depend on data
• Views may vary, more added in the future
• Data store implementation may change
• We want:
• Separate the data aspect from the view one
• Notify views upon change in data
Slide 5
5
תבנית העיצוב Observer
ניתן לתכנן את
המחלקות גם אחרת!
Slide 6
6
Observerבג'אווה
• ג'אווה מספקת לנו מנשק ,Observer
ומחלקה Observable
• נממש את Observer
• כדי ליצור ,subjectנכתוב מחלקה שיורשת מ .Observable-כבר
נתונים לנו
• הוספה והסרה של Observers
• מסירת ההודעה ל Observers -הרשומים
Slide 7
7
Observer
Slide 8
8
Observable
Slide 9
9
Observable and Observer
Observer
O1
Observable
O1 O2 O 3
change
Observer
O2
Observer
O3
9
Slide 10
10
Example Code - Subject
public class IntegerDataBag extends Observable
implements Iterable {
private ArrayList list = new ArrayList();
public void add( Integer i ) {
list.add(i);
setChanged();
notifyObservers();
}
public Iterator iterator() {
return list.iterator();
}
public Integer remove( int index ) {
if( index < list.size() ) {
Integer i = list.remove( index );
setChanged();
notifyObservers();
return i;
}
return null;
}
}
Slide 11
11
Example Code - Observer
public class IntegerAdder implements Observer {
private IntegerDataBag bag;
public IntegerAdder( IntegerDataBag bag ) {
this.bag = bag;
bag.addObserver( this );
}
public void update(Observable o, Object arg) {
if (o == bag) {
println("The contents of the IntegerDataBag have changed.");
int sum = 0;
for (Integer i : bag) {
sum += i;
}
println("The new sum of the integers is: " + sum);
}
}
...
}
תוכנה 1
תבנית העיצוב Observer
שחר מעוז
1
בית הספר למדעי המחשב
אוניברסיטת תל אביב
Slide 2
2
תבניות עיצוב ()Design Patterns
• פתרונות כלליים לבעיות עיצוב שחוזרות על עצמן
• מגדירים שפה כללית יותר לדיון על עיצוב התכנית
• Factory, Singleton, Observerבמקום
"המחלקה Aיורשת מהמחלקה "B
• ספרDesign Patterns: Elements of :
Reusable Object-Oriented Software
• מידע רב בנושא קיים ברשת
• בקורס ראינו כבר מספר תבניות ,למשל
Factory, Bridge, Adapter, Template method
Slide 3
3
Different Views
60
50
60
40
50
30
40
30
Series1
Series1
10
10
0
1
2
3
2
3
20
20
0
1
1
2
Data
a=50
b=10
C=20
3
Slide 4
4
Different Views (cont.)
• When the data changes, all views should change
• Views depend on data
• Views may vary, more added in the future
• Data store implementation may change
• We want:
• Separate the data aspect from the view one
• Notify views upon change in data
Slide 5
5
תבנית העיצוב Observer
ניתן לתכנן את
המחלקות גם אחרת!
Slide 6
6
Observerבג'אווה
• ג'אווה מספקת לנו מנשק ,Observer
ומחלקה Observable
• נממש את Observer
• כדי ליצור ,subjectנכתוב מחלקה שיורשת מ .Observable-כבר
נתונים לנו
• הוספה והסרה של Observers
• מסירת ההודעה ל Observers -הרשומים
Slide 7
7
Observer
Slide 8
8
Observable
Slide 9
9
Observable and Observer
Observer
O1
Observable
O1 O2 O 3
change
Observer
O2
Observer
O3
9
Slide 10
10
Example Code - Subject
public class IntegerDataBag extends Observable
implements Iterable
private ArrayList
public void add( Integer i ) {
list.add(i);
setChanged();
notifyObservers();
}
public Iterator
return list.iterator();
}
public Integer remove( int index ) {
if( index < list.size() ) {
Integer i = list.remove( index );
setChanged();
notifyObservers();
return i;
}
return null;
}
}
Slide 11
11
Example Code - Observer
public class IntegerAdder implements Observer {
private IntegerDataBag bag;
public IntegerAdder( IntegerDataBag bag ) {
this.bag = bag;
bag.addObserver( this );
}
public void update(Observable o, Object arg) {
if (o == bag) {
println("The contents of the IntegerDataBag have changed.");
int sum = 0;
for (Integer i : bag) {
sum += i;
}
println("The new sum of the integers is: " + sum);
}
}
...
}