08 Αντικειμενοστραφής ανάλυση και σχεδιασμός

Σχετικά έγγραφα
Τεχνολογία Λογισμικού

02 Αντικειμενοστρεφής Προγραμματισμός

04 Αντικειμενοστραφής ανάλυση και σχεδιασμός

Τεχνολογία Λογισμικού

14 Πρότυπα Σχεδίασης συνέχεια

Τεχνολογία Λογισμικού

06 Αντικειμενοστρεφής ανάλυση και σχεδιασμός


ΠΤΥΧΙΑΚΗ ΕΡΓΑΣΙΑ Αξιολόγηση των Σχεδιαστικών Προτύπων και της Ποιότητας του Λογισμικού μέσω Μετρικών, στις Περιπτώσεις Προσθήκης Λειτουργικότητας και

Καλές επιτυχίες παιδιά στα υπόλοιπα μαθήματά σας και καλές γιορτές!!!!

Εισαγωγή στον Αντικειμενοστρέφή Προγραμματισμό Διάλεξη #13

Κλάσεις στη Java. Παύλος Εφραιμίδης. Java Κλάσεις στη Java 1

Κλάσεις στη Java. Στοίβα - Stack. Δήλωση της κλάσης. ΗκλάσηVector της Java. Ηκλάση Stack

Wrapper Classes, Abstract Classes and Interfaces

Αντικειμενοστρεφής Προγραμματισμός

11β Δομικά πρότυπα σχεδίασης

Αντικειμενοστρέφεια. Henri Matisse, Harmony in Red, Κωστής Σαγώνας Νίκος Παπασπύρου

Τεχνολογία Λογισμικού

ΑΠΛΗ ΚΛΗΡΟΝΟΜΙΚΟΤΗΤΑ

Διάλεξη 16-17: Πολυμορφισμός (Polymorphism) Διδάσκων: Παναγιώτης Ανδρέου

Αρχές Τεχνολογίας Λογισμικού Εργαστήριο

Οντοκεντρικός Προγραμματισμός

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Σύνθεση αντικειμένων

08 Η γλώσσα UML I. Τεχνολογία Λογισμικού. Σχολή Hλεκτρολόγων Mηχανικών & Mηχανικών Yπολογιστών Εθνικό Μετσόβιο Πολυτεχνείο. Χειμερινό εξάμηνο

Διασυνδέσεις / Διεπαφές. Παναγιώτης Σφέτσος, PhD

Γλώσσες προγραµµατισµού. Ανάπτυξη Συστηµάτων Λογισµικού

Οντοκεντρικός Προγραμματισμός

Εαρινό. Ύλη εργαστηρίου, Ασκήσεις Java

Κλάσεις. Τροποποιητές, ιασυνδέσεις, Πακέτα. Τροποποιητές ελέγχου προσπέλασης µεταβλητών και µεθόδων

Μοτίβα Σχεδίασης (Design Patterns)

Η λέξη κλειδί this. Γαβαλάς Δαμιανός

Εαρινό. Ύλη εργαστηρίου, Ασκήσεις Java

. Μεθοδολογία Προγραμματισμού. Abstract Κλάσεις και Interfaces. Νικόλαος Πεταλίδης. Εισαγωγή Εαρινό Εξάμηνο 2014

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Σύνθεση αντικειμένων Παράδειγμα: Τμήμα πανεπιστημίου

14η ιάλεξη. Προχωρημένα θέματα σχεδίασης

Προγραμματισμός Ι. Κλάσεις και Αντικείμενα. Δημήτρης Μιχαήλ. Τμήμα Πληροφορικής και Τηλεματικής Χαροκόπειο Πανεπιστήμιο

1 ΕΙΣΑΓΩΓΗ. Πρωταρχικοί Τύποι

Αντικειμενοστρεφής Προγραμματισμός Διάλεξη 9 : ΑΦΗΡΗΜΕΝΕΣ ΚΛΑΣΕΙΣ

(Διαφάνειες Νίκου Βιδάκη)

Αντικειμενοστρεφής Προγραμματισμός

11α Κατασκευαστικά πρότυπα σχεδίασης

Διδάσκων: Παναγιώτης Ανδρέου

ΑΡΦΕ ΑΝΣΙΚΕΙΜΕΝΟΣΡΕΥΟΤ ΠΡΟΓΡΑΜΜΑΣΙΜΟΤ. Ιωάννης Φατζηλυγερούδης Αναπληρωτής Καθηγητής Τμήμα Μηχ/κών Η/Υ και Πληροφορικής Πανεπιστήμιο Πατρών

Εισαγωγή στον Προγ/μό Η/Υ

Δομές Δεδομένων & Ανάλυση Αλγορίθμων. 3ο Εξάμηνο. Ουρά (Queue) Υλοποίηση της με τη βοήθεια πίνακα.

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Κλάσεις και Αντικείμενα Μέθοδοι

Αντικειμενοστρεφής Προγραμματισμός

Διάλεξη 5: Κλάσεις και Αντικείμενα. Διδάσκων: Παναγιώτης Ανδρέου

Από τη UML στον Κώδικα. Μέρος Β

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Κλάσεις και Αντικείμενα Μέθοδοι

ΑΤΕΙ ΘΕΣΣΑΛΟΝΙΚΗΣ ΤΜΗΜΑ ΜΗΧΑΝΙΚΩΝ ΠΛΗΡΟΦΟΡΙΚΗΣ Αλγοριθμική και Προγραμματισμός. Παναγιώτης Σφέτσος

ηµιουργία νέου τύπου δεδοµένων από το χρήστη

Αντικειμενοστρεφής Προγραμματισμός

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ

Εισαγωγή στον Αντικειμενοστρέφή Προγραμματισμό Διάλεξη #12

Οντοκεντρικός Προγραμματισμός ΦΡΟΝΤΙΣΤΗΡΙΟ JAVA

Εφαρμοσμένη Πληροφορική ΙΙ (Θ) Αντικειμενοστραφής Προγραμματισμός και JavaScript

Δυναμική μνήμη με πίνακες και λίστες

Στόχοι της Πτυχιακής

09 Η γλώσσα UML I. Τεχνολογία Λογισμικού. Τμήμα Πληροφορικής & Τηλεπικοινωνιών Εθνικό και Καποδιστριακό Πανεπιστήμιο Αθηνών. Εαρινό εξάμηνο

Δοµές Δεδοµένων. 6η Διάλεξη Αναδροµικές Εξισώσεις και Αφηρηµένοι Τύποι Δεδοµένων. Ε. Μαρκάκης

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Στατικές μέθοδοι και μεταβλητές Εσωτερικές κλάσεις

Κλάσεις. Κατηγορίες Αντικειµένων. Κλάσεις. Φυσικά Αντικείµενα. Χώρος = Οµάδα Φυσικών Αντικειµένων. Πρόγραµµα = Οµάδα

Κεφάλαιο 15 Γλώσσα προγραμματισμού Java

3 Αλληλεπίδραση Αντικειμένων

Εργαστήριο 02: Προγραμματισμός με Γενικούς Τύπους (JAVA Generics) ΕΠΛ231 Δομές Δεδομένων και Αλγόριθμοι

Abstract classes, Interfaces ΦΡΟΝΤΙΣΤΗΡΙΟ JAVA

Κληρονομικότητα. Παύλος Εφραιμίδης pefraimi <at> ee.duth.gr. Java Κληρονομικότητα 1

Τεχνολογίες Υλοποίησης Αλγορίθµων

Προγραμματισμός Διαδικτύου

ΚΛΑΣΕΙΣ ΜΕΘΟΔΟΙ - ΑΝΤΙΚΕΙΜΕΝΑ

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ

Ειδικά Θέματα Προγραμματισμού

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Σύνθεση αντικειμένων

Αντικειµενοστραφής Προγραµµατισµός

Βασικά της γλώσσας JAVA

5. Ανασκόπηση αντικειμενοστραφούς προγραμματισμού

Δομές Δεδομένων - Εργαστήριο 2. Λίστες

Εισαγωγή σε αντικειμενοστραφή concepts. Και λίγη C#

Abstract classes, Interfaces ΦΡΟΝΤΙΣΤΗΡΙΟ JAVA

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Κλάσεις και Αντικείμενα Μέθοδοι

Μέθοδοι. Υποσυστήµατα και πακέτα. Μοντέλα αντικειµενοστραφούς σχεδίασης. Αντικειµενοστραφής Σχεδίαση. Στα πρώτα στάδια της ανάλυσης

public void printstatement() { System.out.println("Employee: " + name + " with salary: " + salary);

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Κλάσεις και Αντικείμενα Μέθοδοι

Αντικειμενοστρεφής Προγραμματισμός

AVL-trees C++ implementation

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Σύνθεση αντικειμένων

. Μεθοδολογία Προγραμματισμού. Μοτίβα σχεδίασης (Design Patterns) Νικόλαος Πεταλίδης. Εισαγωγή Εαρινό Εξάμηνο 2014

Οντοκεντρικός Προγραμματισμός

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Σύνθεση αντικειμένων

class object Database Database Item Item [sub-typing and polymorphism] MusicCD Video MusicCD Video

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Σύνθεση αντικειμένων

Εισαγωγή στον Αντικειμενοστρεφή Προγραμματισμό Διάλεξη #2

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Σύνθεση αντικειμένων

Διδάσκων: Παναγιώτης Ανδρέου

Αντικειμενοστρεφής Προγραμματισμός

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Πολυμορφισμός Αφηρημένες κλάσεις Interfaces (διεπαφές)

Υπερφόρτωση (Overloading) Υπέρβαση (Overriding) - Upcasting Downcasting Final classes, methods

ΗΥ-252 Οντοκεντρικός Προγραµµατισµός Βασίλης Χριστοφίδης. Επαναληπτική Εξέταση (3 ώρες) Ηµεροµηνία: 12 Σεπτεµβρίου 2002

Αντικειµενοστρεφής Προγραµµατισµός

Transcript:

08 Αντικειμενοστραφής ανάλυση και σχεδιασμός Τεχνολογία Λογισμικού Τμήμα Πληροφορικής & Τηλεπικοινωνιών Εθνικό και Καποδιστριακό Πανεπιστήμιο Αθηνών Εαρινό εξάμηνο 2017 18 Δρ. Κώστας Σαΐδης saiko@di.uoa.gr

Περιεχόμενα 1. Αντικειμενοστράφεια με παραδείγματα σε Java, Javascript 2. UML αργότερα σήμερα 3. Πρότυπα σχεδίασης σε επόμενη διάλεξη, σήμερα θα κάνουμε μια μικρή εισαγωγική κουβέντα 2

Αντικειμενοστράφεια 3

Αντικείμενα Ενθυλακώνουν encapsulate Kατάσταση state δεδομένα που τηρούνται σε πεδία Συμπεριφορά behavior λειτουργίες που τηρούνται σε μεθόδους behavior Στιγμιοτύπιση instantiation Μέσω κατασκευαστών constructors Αυτο αναφορά this, self Ανταλλαγή μηνυμάτων message passing 4

Βασικές έννοιες Συνάθροιση aggregation Σύνθεση composition Κληρονομικότητα inheritance Με βάση κλάσεις / διεπαφές classes / interfaces Με βάση πρωτότυπα prototypes Δυναμική αποστολή μηνυμάτων dynamic method dispatch Αργή δέσμευση late binding Πολυμορφισμός 5

Βασικές αρχές αφαίρεσης abstraction principles Το σήμειο που το αντικειμενοστραφές μοντέλο συνδέεται με την εννοιολογική μοντελοποίηση conceptual modeling και την αναπαράσταση γνώσης knowledge represenation 6

Λίστα αναγνωσμάτων Antero Taivalsaari, "On the notion of inheritance", ACM Computing Surveys, Vol. 28, No 3, September 1996. 7

I. Classification Instantiation A. Taivalsaari 8

Classification Instantiation Σχέση του αντικειμένου με την κλάση του και αντίστροφα. Όλα τα αντικείμενα / στιγμιότυπα μιας κλάσης μοιράζονται κοινά και ομοιόμορφα χαρακτηριστικά. Η κλάση είναι το intensional abstraction όλων των δυνατών της αντικειμένων. 9

Παράδειγμα Java class Point { private int x; private int y; public Point(int x, int y) { this.x = x; this.y = y; public int getx() { return x; public int gety() { return y; public void setx(int x) { this.x = x; public void sety(int y) { this.y = y; public void addtox(int num) { this.x += num; public void addτoy(int num) { this.y += num; 10

Χρήση Point p1 = new Point(0, 0); //στιγμιοτύπιση p1.addtox(10); //αποστολή μηνύματος (επίκληση μεθόδου) Point p2 = new Point(10, 0); assert(p1.getx() == p2.getx()); assert(p1 instanceof Point); assert(p2 instanceof Point); 11

Παράδειγμα Javascript < ES6 var Point = function(x, y) { //constuctor this.x = x; this.y = y; this.getx = function() { return this.x; this.gety = function() { return this.y; this.setx = function(x) { this.x = x; this.sety = function(y) { this.y = y; this.addtox = function(num) { this.x += num; this.addtoy = function(num) { this.y += num; 12

Καλύτερο Παράδειγμα Javascript < ES6 var Point = function(x, y) { //constuctor this.x = x; this.y = y; Point.prototype.getX = function() { return this.x; Point.prototype.getY = function() { return this.y; Point.prototype.setX = function(x) { this.x = x; Point.prototype.setY = function(y) { this.y = y; Point.prototype.addToX = function(num) { this.x += num; Point.prototype.addToY = function(num) { this.y += num; 13

Παράδειγμα Javascript >= ES6 class Point { constructor(x, y) { this.x = x; this.y = y; get x() { return this.x; get y() { return this.y; set x(x) { this.x = x; set y(y) { this.y = y; addtox(num) { this.x += num; addτoy(num) { this.y += num; 14

Χρήση var p1 = new Point(0, 0); p1.addtox(10); var p2 = new Point(10, 0); assert p1.getx() == p2.getx(); assert (p1 instanceof Point); assert (p2 instanceof Point); 15

2. Aggregation Decomposition A. Taivalsaari 16

Aggregation Decomposition Συνάθροιση ή σύνθεση επιμέρους εννοιών για τη σύσταση μιας νέας ξεχωριστής έννοιας. Σχέσεις μέρους όλου part of. 17

Παράδειγμα Java Ένα αντικείμενο περιέχει συντίθεται από άλλο αντικείμενα class Line { private Point first; private Point second; public Line(Point first, Point second) { this.first = first; this.second = second; Point getfirstpoint() { return first; Point getsecondpoint() { return second; 18

Παράδειγμα ES6 Ένα αντικείμενο περιέχει συντίθεται από άλλο αντικείμενα class Line { constructor(first, second) { //Points this.first = first; this.second = second; getfirstpoint() { return this.first; getsecondpoint() { return this.second; 19

3. Generalization Specialization A. Taivalsaari 20

Generalization Specialization Σχέση μεταξύ κλάσεων. Η γενική κλάση συγκεντρώνει τα κοινά στοιχεία όλων των εξειδικεύσεών της. Η κληρονομικότητα είναι ο κατεξοχήν μηχανισμός υλοποίησης της εξειδίκευσης. 21

Κληρονομικότητα Ένα αντικείμενο κληρονομεί τα πεδία ή/και τις μεθόδους των "προγόνων" του Στην πράξη έχουμε: Κληρονομικότητα για εξειδίκευση specialization Κληρονομικότητα για επαναχρησιμοποίηση reuse 22

Παράδειγμα Java class Arrow extends Line { enum Direction{FIRST_TO_SECOND, SECOND_TO_FIRST; private Direction d; public Arrow(Point p1, Point p2, Direction d) { super(p1, p2); this.d = d; public void toggledirection() { if (d == Direction.FIRST_ΤΟ_SECOND) d = Direction.SECOND_TO_FIRST; else d = Direction.FIRST_ΤΟ_SECOND; 23

Χρήση Point p1 = new Point(0, 0); Point p2 = new Point(10, 10); Arrow a = new Arrow(p1, p2, Arrow.Direction.FIRST_TO_SECOND); assert(a instanceof Arrow); //Προφανώς assert(a instanceof Line); //Επίσης πολυμορφισμός assert(a.getfirstpoint().getx() == 0); //Κληρονομικότητα 24

Παράδειγμα Javascript < ES6 var Line = function() { //Line constructor... var Direction = { FIRST_TO_SECOND: 1, SECOND_TO_FIRST: 2 var Arrow = function(p1, p2, d) { Line.call(this, p1, p2); //call the Line constructor this.d = d; Arrow.prototype = new Line(); //"Inherit" from Line Arrow.prototype.constructor = Arrow; //Just to make sure Arrow.prototype.toggleDirection = function() { if (this.d == Direction.FIRST_ΤΟ_SECOND) this.d = Direction.SECOND_TO_FIRST; else this.d = Direction.FIRST_ΤΟ_SECOND; 25

Παράδειγμα Javascript >= ES6 class Line {... var Direction = { FIRST_TO_SECOND: 1, SECOND_TO_FIRST: 2 class Arrow extends Line { constructor(p1, p2, d) { super(p1, p2); this.d = d; toggledirection() { if (this.d == Direction.FIRST_ΤΟ_SECOND) this.d = Direction.SECOND_TO_FIRST; else this.d = Direction.FIRST_ΤΟ_SECOND; 26

Χρήση var p1 = new Point(0, 0); var p2 = new Point(10, 10); var a = new Arrow(p1, p2, Direction.FIRST_TO_SECOND); assert(a instanceof Arrow); assert(a instanceof Line); assert(a.getfirstpoint().getx() == 0); 27

Private state/behavior Στο απλό παράδειγμά μας: Η κλάση Point ενθυλακώνει δύο ακεραίους Η κλάση Line ενθυλακώνει δύο Point αντικείμενα Η κλάση Arrow ενθυλακώνει δύο Point αντικείμενα και μια διεύθυνση Μηχανισμός απόκρυψης πληροφορίας information hiding 28

Private state σε Javascript var Line = function(x, y) { var state = { x:x, y:y ; this.getx = function() { return state.x... ; 29

4. Grouping Individualization A. Taivalsaari 30

Ομαδοποίηση Διαχωρισμός Ομαδοποίηση αντικειμένων με βάση κάποιο extensional και όχι intensional χαρακτηριστικό. Παραδείγματα: Αγαπημένα του χρήστη user favorites Πιο πρόσφατα / πιο δημοφιλή Αποτελέσματα μιας αναζήτησης 31

Πολυμορφισμός Παροχή μιας κοινής διεπαφής για αντικείμενα διαφορετικών τύπων ή Ένα αντικείμενο μπορεί να έχει πολλούς τύπους πολλές συμπεριφορές 32

Είδη πολυμορφισμού Universal polymorphism Parametric Inclusion Ad hoc Overloading Coercion 33

Λίστα αναγνωσμάτων Luca Cardelli, Peter Wegner, "On Understanding Types, Data Abstraction, and Polymorphism", ACM Computing Surveys, Vol 17 n. 4, pp 471 522, December 1985. 34

Ad hoc πολυμορφισμός Overloading Operator overloading int x = 3 + 5; String s = name + " " + surname; Method overloading class Foo { void dosomething(a a) {... void dosomething(a a, B b) {... class Bar extends Foo { void dosomething(c c, D d) {... 35

Ad hoc πολυμορφισμός Coercion Type coercion double x = 1; //The int constant is converted to double automatically double avg, sum; int count;... avg = sum / count; //The int count is coverted to double automatically //before applying the division 36

Παραμετρικός πολυμορφισμός Generics class Cache<K, V> { private final Map<K, V> cache = new HashMap<>(); public synchronized void put(k key, V value) { cache.put(key, value); public synchronized V get(k key) { return cache.get(key); 37

Cache<String, Line> linelabels = new Cache<>(); cache.put("first line", someline); cache.put("second line", someotherline); 38

Πολυμορφισμός υπο τύπων inclusion polymorphism interface Shape { double getarea(); class Rectangle implements Shape { private double width; private double height; public double getarea() { return width * height; class Circle implements Shape { private double radius; public double getarea() { return Math.PI * radius * radius; 39

class AreaPrinter { public static void print(shape s) { System.out.println(s.getArea()); Rectangle r = new Rectangle(2.0, 3.0); Circle c = new Circle(1.0); AreaPrinter.print(r); // 6.0 AreaPrinter.print(c); // 3.14 40

Δυναμική αποστολή μηνυμάτων και αργή δέσμευση interface Computation { String getname(); void compute(); abstract class ComputationBase implements Computation { public String getname() { return getclass().getname(); 41

class SimpleComputation extends ComputationBase { public void compute() { System.out.println("Done computing"); class SimpleComputation2 extends SimpleComputation { public String getname() { return "Simple2" 42

class ListOfComputations extends ComputationBase { private final List<Computation> computations; public ListOfComputations(Computation... computations) { this.computations = Arrays.asList(computations); public void compute() { for(computation c: computations) { System.out.println("Computing: " + c.getname()); c.compute(); 43

Computation c1 = new SimpleComputation(); Computation c2 = new SimpleComputation2(); Computation list = new ListOfComputations(c1, c2); System.out.println(list.getName()); list.compute(); //Output ListOfComputations Computing: SimpleComputation Done computing Computing: Simple2 Done computing 44

Εισαγωγή στα πρότυπα σχεδίασης 45

Πρότυπο σχεδίασης Design pattern Μια καλή πρακτική για την αντιμετώπιση ενός σχεδιαστικού προβλήματος στο λογισμικό. 46

Προσοχή Ένας τρόπος δόμησης/διάρθωσης του κώδικα για την επίλυση ενός συγκεκριμένου προβλήματος όχι ο κώδικας καθ' αυτός. Η υπερβολική χρήση των προτύπων επιφέρει περισσότερα προβλήματα απ' όσα λύνει αύξηση πολυπλοκότητας. 47

Λίστα αναγνωσμάτων Erich Gamma, Richard Helm, Ralph Johnson, John Vlissides, "Design Patterns: Elements of Reusable Object Oriented Software", Addison Wesley, 1994, 0 201 63361 2. 48

Κύρια είδη προτύπων Αρχιτεκτονικά architectural MVC, MVVM, κ.ά Κατασκευαστικά creational Factory, Builder, Object Pool, Singleton, κ.ά Δομικά structural Adapter/Wrapper, Bridge, Decorator, Facade, Proxy, κ.ά Συμπεριφοράς behavioral Chain of responsibility, Command, Iterator, Mediator, Observer, Strategy, Template method, Visitor, κ.ά 49

Παράδειγμα 50

Visitor Διαχωρισμός του αλγορίθμου από τη δομή δεδομένων. Η "λογική" της επίσκεψης στα στοιχεία της δομής traversal διαχωρίζεται από τη δομή αυτή καθ' αυτή. 51

Παράδειγμα interface TreeVisitor { void visit(treenode node); interface TreeNode { TreeNode getleft(); TreeNode getright(); int getvalue(); void accept(treevisitor visitor); class SimpleTreeNode implements TreeNode {... public void accept(treevisitor vistor) { visitor.visit(this); 52

Υλοποίση class PreOrderTreeVisitor implements TreeVisitor { public void visit(treenode node) { int value = node.getvalue(); //do something with the node's value... //then traverse from left to right (pre order) TreeNode left = node.getleft(); if (left!= null) left.accept(this); TreeNode right = node.getright(); if (right!= null) right.accept(this); 53

Πραγματικό Παράδειγμα Java 7+ FileVisitor java.nio.files static Path walkfiletree( Path start, FileVisitor<? super Path> visitor ) throws IOException 54

java.nio.file.filevisitor interface FileVisitor<T> { FileVisitResult postvisitdirectory(t dir,...) FileVisitResult previsitdirectory(t dir,...) FileVisitResult visitfile(t file,...) FileVisitResult visitfilefailed(t file,...) 55

Θα επανέλθουμε σε επόμενη διάλεξη... 56