תוכנה 1 תבנית העיצוב Observer שחר מעוז 1 בית הספר למדעי המחשב אוניברסיטת תל אביב

Download Report

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);
}
}
...
}