Top Banner
1 ללללל11 : Design Patterns ללללללל ללללללל ללל לללללל לללל לללל1 ללללל1
27

1 תרגול 11: Design Patterns ומחלקות פנימיות אסף זריצקי ומתי שמרת 1 תוכנה 1.

Jan 19, 2018

Download

Documents

Nelson Bridges

3 Different Views Data a=50 b=10 C=20
Welcome message from author
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript
Page 1: 1 תרגול 11: Design Patterns ומחלקות פנימיות אסף זריצקי ומתי שמרת 1 תוכנה 1.

1

Design Patterns: 11תרגול ומחלקות פנימיותאסף זריצקי ומתי שמרת

1

1תוכנה

Page 2: 1 תרגול 11: Design Patterns ומחלקות פנימיות אסף זריצקי ומתי שמרת 1 תוכנה 1.

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.

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.

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.

5

The Observer Design Pattern

A.k.a publish/subscribe

Page 6: 1 תרגול 11: Design Patterns ומחלקות פנימיות אסף זריצקי ומתי שמרת 1 תוכנה 1.

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.

7

Observable and Observer

Observable

Observer

Observer

Observer

addObserver

addObserveraddObserver

change

Page 8: 1 תרגול 11: Design Patterns ומחלקות פנימיות אסף זריצקי ומתי שמרת 1 תוכנה 1.

8

Observable and Observer

Observable

Observer

Observer

Observer

change

notify observers

update

update

update

Page 9: 1 תרגול 11: Design Patterns ומחלקות פנימיות אסף זריצקי ומתי שמרת 1 תוכנה 1.

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.

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.

1111

מחלקות פנימיות )מקוננות(Inner (Nested) Classes

Page 12: 1 תרגול 11: Design Patterns ומחלקות פנימיות אסף זריצקי ומתי שמרת 1 תוכנה 1.

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.

1313

מחלקות פנימיות הגדרת מחלקה כפנימית מרמזת על היחס בין המחלקה הפנימית

והמחלקה העוטפת: למחלקה הפנימית יש משמעות רק בהקשר של המחלקה

העוטפתלמחלקה הפנימית יש הכרות אינטימית עם המחלקה העוטפתהמחלקה הפנימית היא מחלקת עזר של המחלקה העוטפת

:דוגמאותCollection -ו IteratorBody -ו Brain:מבני נתונים המוגדרים ברקורסיה List-וCell

Page 14: 1 תרגול 11: Design Patterns ומחלקות פנימיות אסף זריצקי ומתי שמרת 1 תוכנה 1.

1414

Inner Classes בJava כל מופע של עצם מטיפוס המחלקה הפנימית

משויך לעצם מטיפוס המחלקה העוטפת

השלכותתחביר מיוחד לבנאי לעצם מטיפוס המחלקה הפנימית יש שדה הפנייה שמיוצר

אוטומטית לעצם מהמחלקה העוטפת כתוצאה לכך יש למחלה הפנימית גישה לשדות ולשרותים

ולהיפך)אפילו פרטיים!( של המחלקה העוטפת

Page 15: 1 תרגול 11: Design Patterns ומחלקות פנימיות אסף זריצקי ומתי שמרת 1 תוכנה 1.

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.

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.

1717

יצירת מופעים

כאשר המחלקה העוטפת יוצרת מופע של עצםמטיפוס המחלקה הפנימית אזי העצם נוצר

בהקשר של העצם היוצר

כאשר עצם מטיפוס המחלקה הפנימית נוצרמחוץ למחלקה העוטפת, יש צורך בתחביר מיוחד

Page 18: 1 תרגול 11: Design Patterns ומחלקות פנימיות אסף זריצקי ומתי שמרת 1 תוכנה 1.

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.

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.

2020

Static Nested Classes ניתן להגדיר מחלקה פנימית כstatic ובכך לציין שהיא

אינה קשורה למופע מסוים של המחלקה העוטפת

-הדבר אנלוגי למחלקה שכל שרותיה הוגדרו כstatic עבור מחלקה מסוימתכספריהוהיא משמשת

בשפת(C++ יחס זה מושג ע"י הגדרת יחס friend(

Page 21: 1 תרגול 11: Design Patterns ומחלקות פנימיות אסף זריצקי ומתי שמרת 1 תוכנה 1.

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.

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.

2323

מחלקות מקומיות -מחלקות פנימיות בתוך מתודות

של בתוך שירותניתן להגדיר מחלקה פנימית המחלקה העוטפת

הדבר מגביל את תחום ההכרה של אותה מחלקהלתחום השירות בלבד

המחלקה הפנימית תוכל להשתמש במשתניםמקומיים של המתודה רק אם הם הוגדרו

)מדוע?(finalכ-

Page 24: 1 תרגול 11: Design Patterns ומחלקות פנימיות אסף זריצקי ומתי שמרת 1 תוכנה 1.

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.

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.

2626

מחלקות אנונימיות

בעזרת מחלקות פנימיות ניתן להגדיר מחלקותאנונימיות – מחלקות ללא שם

מחלקות אנונימיות שימושיות מאוד במערכות( וילמדו בהמשך הקורסGUIמונחות ארועים )כגון

Page 27: 1 תרגול 11: Design Patterns ומחלקות פנימיות אסף זריצקי ומתי שמרת 1 תוכנה 1.

2727

הידור של מחלקות פנימיות המהדר )קומפיילר( יוצר קובץ.class .עבור כל מחלקה

מחלקה פנימית אינה שונה במובן זה ממחלקה רגילה

שם המחלקה הפנימית יהיה Outer$Inner.class

אם המחלקה הפנימית אנונימית, שם המחלקה שיוצרOuter$1.classהקומפיילר יהיה