1 תרגול 11: design patterns ומחלקות פנימיות אסף זריצקי ומתי שמרת...
DESCRIPTION
3 Different Views Data a=50 b=10 C=20TRANSCRIPT
![Page 1: 1 תרגול 11: Design Patterns ומחלקות פנימיות אסף זריצקי ומתי שמרת 1 תוכנה 1](https://reader035.vdocument.in/reader035/viewer/2022062909/5a4d1bae7f8b9ab0599cb9bb/html5/thumbnails/1.jpg)
1
Design Patterns: 11תרגול ומחלקות פנימיותאסף זריצקי ומתי שמרת
1
1תוכנה
![Page 2: 1 תרגול 11: Design Patterns ומחלקות פנימיות אסף זריצקי ומתי שמרת 1 תוכנה 1](https://reader035.vdocument.in/reader035/viewer/2022062909/5a4d1bae7f8b9ab0599cb9bb/html5/thumbnails/2.jpg)
2
Design Patterns
A general reusable solution to recurring design problems. Not a recipe
A higher level language for design Factory, Singleton, Observer and not “this
class inherits from that other class” Design Patterns: Elements of
Reusable Object-Oriented Software Lots of information online
![Page 3: 1 תרגול 11: Design Patterns ומחלקות פנימיות אסף זריצקי ומתי שמרת 1 תוכנה 1](https://reader035.vdocument.in/reader035/viewer/2022062909/5a4d1bae7f8b9ab0599cb9bb/html5/thumbnails/3.jpg)
3
Different Views
Dataa=50b=10C=20
1
23
0
10
20
30
40
50
60
1 2 3
Series1
0
10
20
30
40
50
60
1 2 3
Series1
![Page 4: 1 תרגול 11: Design Patterns ומחלקות פנימיות אסף זריצקי ומתי שמרת 1 תוכנה 1](https://reader035.vdocument.in/reader035/viewer/2022062909/5a4d1bae7f8b9ab0599cb9bb/html5/thumbnails/4.jpg)
4
Different Views (cont.)
When the data change all views should change Views dependant on data
Views may vary, more added in the future Data store implementation may changes We want:
Separate the data aspect from the view one Notify views upon change in data
![Page 5: 1 תרגול 11: Design Patterns ומחלקות פנימיות אסף זריצקי ומתי שמרת 1 תוכנה 1](https://reader035.vdocument.in/reader035/viewer/2022062909/5a4d1bae7f8b9ab0599cb9bb/html5/thumbnails/5.jpg)
5
The Observer Design Pattern
A.k.a publish/subscribe
![Page 6: 1 תרגול 11: Design Patterns ומחלקות פנימיות אסף זריצקי ומתי שמרת 1 תוכנה 1](https://reader035.vdocument.in/reader035/viewer/2022062909/5a4d1bae7f8b9ab0599cb9bb/html5/thumbnails/6.jpg)
6
Observer and Java
Java provides an Observer interface and an Observable class
Subclass Observable to implement your own subject registration and removal of observers notification
Implement Observer Other uses of this pattern throughout the JDK
![Page 7: 1 תרגול 11: Design Patterns ומחלקות פנימיות אסף זריצקי ומתי שמרת 1 תוכנה 1](https://reader035.vdocument.in/reader035/viewer/2022062909/5a4d1bae7f8b9ab0599cb9bb/html5/thumbnails/7.jpg)
7
Observable and Observer
Observable
Observer
Observer
Observer
addObserver
addObserveraddObserver
change
![Page 8: 1 תרגול 11: Design Patterns ומחלקות פנימיות אסף זריצקי ומתי שמרת 1 תוכנה 1](https://reader035.vdocument.in/reader035/viewer/2022062909/5a4d1bae7f8b9ab0599cb9bb/html5/thumbnails/8.jpg)
8
Observable and Observer
Observable
Observer
Observer
Observer
change
notify observers
update
update
update
![Page 9: 1 תרגול 11: Design Patterns ומחלקות פנימיות אסף זריצקי ומתי שמרת 1 תוכנה 1](https://reader035.vdocument.in/reader035/viewer/2022062909/5a4d1bae7f8b9ab0599cb9bb/html5/thumbnails/9.jpg)
9
Example Code - Subjectpublic class IntegerDataBag extends Observable
implements Iterable<Integer> {
private ArrayList<Integer> list = new ArrayList<Integer>();
public void add( Integer i ) { list.add(i); setChanged(); notifyObservers(); }
public Iterator<Integer> iterator() { return list.iterator(); }
public Integer remove( int index ) { if( index < list.size() ) { Integer i = list.remove( index ); setChanged(); notifyObservers(); return i; } return null; }}
![Page 10: 1 תרגול 11: Design Patterns ומחלקות פנימיות אסף זריצקי ומתי שמרת 1 תוכנה 1](https://reader035.vdocument.in/reader035/viewer/2022062909/5a4d1bae7f8b9ab0599cb9bb/html5/thumbnails/10.jpg)
10
Example Code - Observerpublic 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); } }
...}
![Page 11: 1 תרגול 11: Design Patterns ומחלקות פנימיות אסף זריצקי ומתי שמרת 1 תוכנה 1](https://reader035.vdocument.in/reader035/viewer/2022062909/5a4d1bae7f8b9ab0599cb9bb/html5/thumbnails/11.jpg)
1111
מחלקות פנימיות )מקוננות(Inner (Nested) Classes
![Page 12: 1 תרגול 11: Design Patterns ומחלקות פנימיות אסף זריצקי ומתי שמרת 1 תוכנה 1](https://reader035.vdocument.in/reader035/viewer/2022062909/5a4d1bae7f8b9ab0599cb9bb/html5/thumbnails/12.jpg)
1212
Inner Classes
מחלקה פנימית היא מחלקה שהוגדרה בתחום(Scope של מחלקה אחרת )בין המסולסליים –
:דוגמא
שימוש לב!
Room אינה שדה של Houseהמחלקה
public class House {
private String address;
public class Room {
private double width;
private double height;
}
}
![Page 13: 1 תרגול 11: Design Patterns ומחלקות פנימיות אסף זריצקי ומתי שמרת 1 תוכנה 1](https://reader035.vdocument.in/reader035/viewer/2022062909/5a4d1bae7f8b9ab0599cb9bb/html5/thumbnails/13.jpg)
1313
מחלקות פנימיות הגדרת מחלקה כפנימית מרמזת על היחס בין המחלקה הפנימית
והמחלקה העוטפת: למחלקה הפנימית יש משמעות רק בהקשר של המחלקה
העוטפתלמחלקה הפנימית יש הכרות אינטימית עם המחלקה העוטפתהמחלקה הפנימית היא מחלקת עזר של המחלקה העוטפת
:דוגמאותCollection -ו IteratorBody -ו Brain:מבני נתונים המוגדרים ברקורסיה List-וCell
![Page 14: 1 תרגול 11: Design Patterns ומחלקות פנימיות אסף זריצקי ומתי שמרת 1 תוכנה 1](https://reader035.vdocument.in/reader035/viewer/2022062909/5a4d1bae7f8b9ab0599cb9bb/html5/thumbnails/14.jpg)
1414
Inner Classes בJava כל מופע של עצם מטיפוס המחלקה הפנימית
משויך לעצם מטיפוס המחלקה העוטפת
השלכותתחביר מיוחד לבנאי לעצם מטיפוס המחלקה הפנימית יש שדה הפנייה שמיוצר
אוטומטית לעצם מהמחלקה העוטפת כתוצאה לכך יש למחלה הפנימית גישה לשדות ולשרותים
ולהיפך)אפילו פרטיים!( של המחלקה העוטפת
![Page 15: 1 תרגול 11: Design Patterns ומחלקות פנימיות אסף זריצקי ומתי שמרת 1 תוכנה 1](https://reader035.vdocument.in/reader035/viewer/2022062909/5a4d1bae7f8b9ab0599cb9bb/html5/thumbnails/15.jpg)
1515
Inner Classespublic class House {
private String address;
public class Room {
// implicit reference to a House
private double width;
private double height;
public String toString(){
return "Room inside: " + address;
}
}
}
![Page 16: 1 תרגול 11: Design Patterns ומחלקות פנימיות אסף זריצקי ומתי שמרת 1 תוכנה 1](https://reader035.vdocument.in/reader035/viewer/2022062909/5a4d1bae7f8b9ab0599cb9bb/html5/thumbnails/16.jpg)
1616
Height of House
Height of Room
Height of RoomSame as this.height
public class House {
private String address;
private double height;
public class Room {
// implicit reference to a House
private double height;
public String toString(){
return "Room height: " + height
+ " House height: " + House.this.height;
}
}
}
Inner Classes
![Page 17: 1 תרגול 11: Design Patterns ומחלקות פנימיות אסף זריצקי ומתי שמרת 1 תוכנה 1](https://reader035.vdocument.in/reader035/viewer/2022062909/5a4d1bae7f8b9ab0599cb9bb/html5/thumbnails/17.jpg)
1717
יצירת מופעים
כאשר המחלקה העוטפת יוצרת מופע של עצםמטיפוס המחלקה הפנימית אזי העצם נוצר
בהקשר של העצם היוצר
כאשר עצם מטיפוס המחלקה הפנימית נוצרמחוץ למחלקה העוטפת, יש צורך בתחביר מיוחד
![Page 18: 1 תרגול 11: Design Patterns ומחלקות פנימיות אסף זריצקי ומתי שמרת 1 תוכנה 1](https://reader035.vdocument.in/reader035/viewer/2022062909/5a4d1bae7f8b9ab0599cb9bb/html5/thumbnails/18.jpg)
1818
יצירת מופע ע"י המחלקה העוטפת
public class House {
private String address;
public void test() {
Room r = new Room();
System.out.println( r );
}
public class Room {
...
}
}
![Page 19: 1 תרגול 11: Design Patterns ומחלקות פנימיות אסף זריצקי ומתי שמרת 1 תוכנה 1](https://reader035.vdocument.in/reader035/viewer/2022062909/5a4d1bae7f8b9ab0599cb9bb/html5/thumbnails/19.jpg)
1919
יצירת מופע שלא ע"י המחלקה החיצונית
outerObject.new InnerClassConstructor
public class Test {
public static void main(String[] args){
House h = new House();
House.Room r = h.new Room();
}
}
![Page 20: 1 תרגול 11: Design Patterns ומחלקות פנימיות אסף זריצקי ומתי שמרת 1 תוכנה 1](https://reader035.vdocument.in/reader035/viewer/2022062909/5a4d1bae7f8b9ab0599cb9bb/html5/thumbnails/20.jpg)
2020
Static Nested Classes ניתן להגדיר מחלקה פנימית כstatic ובכך לציין שהיא
אינה קשורה למופע מסוים של המחלקה העוטפת
-הדבר אנלוגי למחלקה שכל שרותיה הוגדרו כstatic עבור מחלקה מסוימתכספריהוהיא משמשת
בשפת(C++ יחס זה מושג ע"י הגדרת יחס friend(
![Page 21: 1 תרגול 11: Design Patterns ומחלקות פנימיות אסף זריצקי ומתי שמרת 1 תוכנה 1](https://reader035.vdocument.in/reader035/viewer/2022062909/5a4d1bae7f8b9ab0599cb9bb/html5/thumbnails/21.jpg)
2121new OuterClassName.InnerClassConstructor
public class House {
private String address;
public static class Room {
public String toString(){
return “Room “ + address;
}
}
}
public class Test {
public static void main(String[] args){
House.Room r = new House.Room();
...
Error: this room is not related to any house
Not related to any specific house
![Page 22: 1 תרגול 11: Design Patterns ומחלקות פנימיות אסף זריצקי ומתי שמרת 1 תוכנה 1](https://reader035.vdocument.in/reader035/viewer/2022062909/5a4d1bae7f8b9ab0599cb9bb/html5/thumbnails/22.jpg)
2222
הגנה על מחלקות פנימיות אינה מוגדרת( אם המחלקה הפנימית אינה ציבוריתpublic הטיפוס ,)
שלה מוסתר, אבל עצמים מהמחלקה אינם מוסתרים אם יש התייחסות אליהם
public class Outer { private static class Inner implement Interface { ... }
public static Interface getInner() { return new Inner ();
}}
Interface i = new Outer.Inner(); //errorInterface i = Outer.getInner(); // ok
![Page 23: 1 תרגול 11: Design Patterns ומחלקות פנימיות אסף זריצקי ומתי שמרת 1 תוכנה 1](https://reader035.vdocument.in/reader035/viewer/2022062909/5a4d1bae7f8b9ab0599cb9bb/html5/thumbnails/23.jpg)
2323
מחלקות מקומיות -מחלקות פנימיות בתוך מתודות
של בתוך שירותניתן להגדיר מחלקה פנימית המחלקה העוטפת
הדבר מגביל את תחום ההכרה של אותה מחלקהלתחום השירות בלבד
המחלקה הפנימית תוכל להשתמש במשתניםמקומיים של המתודה רק אם הם הוגדרו
)מדוע?(finalכ-
![Page 24: 1 תרגול 11: Design Patterns ומחלקות פנימיות אסף זריצקי ומתי שמרת 1 תוכנה 1](https://reader035.vdocument.in/reader035/viewer/2022062909/5a4d1bae7f8b9ab0599cb9bb/html5/thumbnails/24.jpg)
2424
public class Test {
...
public void test () {
class Info {
private int x;
public Info(int x) {this.x=x;}
public String toString() {
return “** “ + x + “**” ;
}
};
Info info = new Info(0);
System.out.println(info);
}
}
מחלקות מקומיות
![Page 25: 1 תרגול 11: Design Patterns ומחלקות פנימיות אסף זריצקי ומתי שמרת 1 תוכנה 1](https://reader035.vdocument.in/reader035/viewer/2022062909/5a4d1bae7f8b9ab0599cb9bb/html5/thumbnails/25.jpg)
2525
שימוש במשתנים מקומייםpublic class Test {
public void test (int x) {
final int y = x+3;
class Info {
public String toString(){
return “**” + y + “***”;
}
};
System.out.println( new Info());
}
}
![Page 26: 1 תרגול 11: Design Patterns ומחלקות פנימיות אסף זריצקי ומתי שמרת 1 תוכנה 1](https://reader035.vdocument.in/reader035/viewer/2022062909/5a4d1bae7f8b9ab0599cb9bb/html5/thumbnails/26.jpg)
2626
מחלקות אנונימיות
בעזרת מחלקות פנימיות ניתן להגדיר מחלקותאנונימיות – מחלקות ללא שם
מחלקות אנונימיות שימושיות מאוד במערכות( וילמדו בהמשך הקורסGUIמונחות ארועים )כגון
![Page 27: 1 תרגול 11: Design Patterns ומחלקות פנימיות אסף זריצקי ומתי שמרת 1 תוכנה 1](https://reader035.vdocument.in/reader035/viewer/2022062909/5a4d1bae7f8b9ab0599cb9bb/html5/thumbnails/27.jpg)
2727
הידור של מחלקות פנימיות המהדר )קומפיילר( יוצר קובץ.class .עבור כל מחלקה
מחלקה פנימית אינה שונה במובן זה ממחלקה רגילה
שם המחלקה הפנימית יהיה Outer$Inner.class
אם המחלקה הפנימית אנונימית, שם המחלקה שיוצרOuter$1.classהקומפיילר יהיה