Τεχνολογία Λογισμικού - NTUA · Περιεχόμενα 1. Visitor 2. Chain of...

46
12 Πρότυπα σχεδίασης συμπεριφοράς Τεχνολογία Λογισμικού Σχολή Hλεκτρολόγων Mηχανικών & Mηχανικών Yπολογιστών Εθνικό Μετσόβιο Πολυτεχνείο Χειμερινό εξάμηνο 2017‐18 Δρ. Κώστας Σαΐδης ﴾[email protected]﴿

Transcript of Τεχνολογία Λογισμικού - NTUA · Περιεχόμενα 1. Visitor 2. Chain of...

Page 1: Τεχνολογία Λογισμικού - NTUA · Περιεχόμενα 1. Visitor 2. Chain of responsibility 3. Command 4. Mediator 5. Memento 6. Strategy 7. Null Object 3

12 Πρότυπα σχεδίασης συμπεριφοράς

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

Σχολή Hλεκτρολόγων Mηχανικών & Mηχανικών YπολογιστώνΕθνικό Μετσόβιο Πολυτεχνείο

Χειμερινό εξάμηνο 2017‐18

Δρ. Κώστας Σαΐδης ﴾[email protected]﴿

Page 2: Τεχνολογία Λογισμικού - NTUA · Περιεχόμενα 1. Visitor 2. Chain of responsibility 3. Command 4. Mediator 5. Memento 6. Strategy 7. Null Object 3

Πρότυπα σχεδίασης συμπεριφοράςΠρότυπα σχετικά με τη συμπεριφορά / επικοινωνία τωναντικειμένων

2

Page 3: Τεχνολογία Λογισμικού - NTUA · Περιεχόμενα 1. Visitor 2. Chain of responsibility 3. Command 4. Mediator 5. Memento 6. Strategy 7. Null Object 3

Περιεχόμενα1. Visitor2. Chain of responsibility

3. Command4. Mediator5. Memento6. Strategy

7. Null Object

3

Page 4: Τεχνολογία Λογισμικού - NTUA · Περιεχόμενα 1. Visitor 2. Chain of responsibility 3. Command 4. Mediator 5. Memento 6. Strategy 7. Null Object 3

Επίσης8. Iterator / Iterable9. Observer / Observable

10. Callback / Future / Promise

4

Page 5: Τεχνολογία Λογισμικού - NTUA · Περιεχόμενα 1. Visitor 2. Chain of responsibility 3. Command 4. Mediator 5. Memento 6. Strategy 7. Null Object 3

VisitorΣκοπός: Να διαχωρίσει τον αλγόριθμο από τη δομή δεδομένων.

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

Το έχουμε δει ξανά στην εισαγωγή για τα πρότυπα σχεδίασης

5

Page 6: Τεχνολογία Λογισμικού - NTUA · Περιεχόμενα 1. Visitor 2. Chain of responsibility 3. Command 4. Mediator 5. Memento 6. Strategy 7. Null Object 3

Chain of responsibilityΣκοπός: Να περάσει ένα αίτημα μέσω μιας αλυσίδας αντικειμένων

6

Page 7: Τεχνολογία Λογισμικού - NTUA · Περιεχόμενα 1. Visitor 2. Chain of responsibility 3. Command 4. Mediator 5. Memento 6. Strategy 7. Null Object 3

Processingelement

ClientRequest

Processingelement

Processingelement

Processingelement

7

Page 8: Τεχνολογία Λογισμικού - NTUA · Περιεχόμενα 1. Visitor 2. Chain of responsibility 3. Command 4. Mediator 5. Memento 6. Strategy 7. Null Object 3

ΠαράδειγμαΤο παράδειγμα του Composite προτύπου από το προηγούμενομάθημα χρησιμοποιεί το Chain of responsibility

8

Page 9: Τεχνολογία Λογισμικού - NTUA · Περιεχόμενα 1. Visitor 2. Chain of responsibility 3. Command 4. Mediator 5. Memento 6. Strategy 7. Null Object 3

Πραγματικό παράδειγμαServlet filters

9

Page 10: Τεχνολογία Λογισμικού - NTUA · Περιεχόμενα 1. Visitor 2. Chain of responsibility 3. Command 4. Mediator 5. Memento 6. Strategy 7. Null Object 3

CommandΣκοπός: Να "ενθυλακώσει" ένα αίτημα ως αντικείμενο,διαχωρίζοντας τον αποστολέα από τον παραλήπτη

10

Page 11: Τεχνολογία Λογισμικού - NTUA · Περιεχόμενα 1. Visitor 2. Chain of responsibility 3. Command 4. Mediator 5. Memento 6. Strategy 7. Null Object 3

Παράδειγμαjava.lang.Runnable

java.util.concurrent.Callable

11

Page 12: Τεχνολογία Λογισμικού - NTUA · Περιεχόμενα 1. Visitor 2. Chain of responsibility 3. Command 4. Mediator 5. Memento 6. Strategy 7. Null Object 3

MediatorΣκοπός: Να δημιουργήσουμε έναν "ενδιάμεσο" που "γνωρίζει"πώς αλληλεπιδρούν διάφορα αντικείμενα

Χρήσιμο για σχέσεις N‐N

12

Page 13: Τεχνολογία Λογισμικού - NTUA · Περιεχόμενα 1. Visitor 2. Chain of responsibility 3. Command 4. Mediator 5. Memento 6. Strategy 7. Null Object 3

Client

Producer

 

+notify()

Consumer

 

+notify()

Mediator

 

+store()+retrive()

13

Page 14: Τεχνολογία Λογισμικού - NTUA · Περιεχόμενα 1. Visitor 2. Chain of responsibility 3. Command 4. Mediator 5. Memento 6. Strategy 7. Null Object 3

MementoΣκοπός: Να "εξωτερικεύσουμε" με ασφαλή τρόπο την εσωτερικήκατάσταση ενός αντικειμένου ώστε να μπορούμε να τηνεπαναφέρουμε αργότερα.

Για την υλοποίηση λειτουργιών undo ή rollback

14

Page 15: Τεχνολογία Λογισμικού - NTUA · Περιεχόμενα 1. Visitor 2. Chain of responsibility 3. Command 4. Mediator 5. Memento 6. Strategy 7. Null Object 3

Παράδειγμαclass Memento {  private final String state;

  public Memento(String state) {      this.state = state;  }

  public String getState() {      return state;  }}

15

Page 16: Τεχνολογία Λογισμικού - NTUA · Περιεχόμενα 1. Visitor 2. Chain of responsibility 3. Command 4. Mediator 5. Memento 6. Strategy 7. Null Object 3

class Originator {  private String state;  ...//more fields that "depend" on the state   

  private void setState(String state) {          this.state = state;    //change fields depending on the state  }

  public Memento save() {      return new Memento(state);  }    public void restore(Memento m) {    setState(m.getState());      }}

16

Page 17: Τεχνολογία Λογισμικού - NTUA · Περιεχόμενα 1. Visitor 2. Chain of responsibility 3. Command 4. Mediator 5. Memento 6. Strategy 7. Null Object 3

StrategyΣκοπός: Να αναπαραστήσουμε μια οικογένεια αλγορίθμων μεομοιόμορφο τρόπο ώστε να τους εναλλάσσουμε

17

Page 18: Τεχνολογία Λογισμικού - NTUA · Περιεχόμενα 1. Visitor 2. Chain of responsibility 3. Command 4. Mediator 5. Memento 6. Strategy 7. Null Object 3

Παράδειγμα

class Client {  String id  //...  BillingStrategy billingPlan}

interface BillingStrategy {  //Fundamental billing functions}

class EnterprisePlan implements BillingStrategy {  //Billing details of the enterprise plan}

class SimplePlan implements BillingStrategy {  //Billing details of the simple plan}

18

Page 19: Τεχνολογία Λογισμικού - NTUA · Περιεχόμενα 1. Visitor 2. Chain of responsibility 3. Command 4. Mediator 5. Memento 6. Strategy 7. Null Object 3

Null objectΣκοπός: Να υλοποιήσουμε με ομοιόμορφο τρόπο το NO‐OP ﴾donothing﴿

Αποφεύγουμε τους ελέγχους για null διατηρώντας τη λογική τουαλγορίθμου απλή και καθαρή

19

Page 20: Τεχνολογία Λογισμικού - NTUA · Περιεχόμενα 1. Visitor 2. Chain of responsibility 3. Command 4. Mediator 5. Memento 6. Strategy 7. Null Object 3

ΠαράδειγμαΈνα ενδεχόμενο FreePlan στην περίπτωση του BillingStrategyπαραδείγματος μπορεί να υλοποιηθεί ως Null object ﴾μιαυλοποίηση του BillingStrategy με μεθόδους που δεν κάνουντίποτα﴿!

20

Page 21: Τεχνολογία Λογισμικού - NTUA · Περιεχόμενα 1. Visitor 2. Chain of responsibility 3. Command 4. Mediator 5. Memento 6. Strategy 7. Null Object 3

Iterator / IterableΣκοπός: Να μοντελοποιήσουμε την επανάληψη ή τη δυνατότητααυτής

21

Page 22: Τεχνολογία Λογισμικού - NTUA · Περιεχόμενα 1. Visitor 2. Chain of responsibility 3. Command 4. Mediator 5. Memento 6. Strategy 7. Null Object 3

Iteratorjava.util.Iterator

interface Iterator<E> {  boolean hasNext();  E next();  void remove(); //we don't care about this in the class}

Χρήση

while(iterator.hasNext()) {  Element e = iterator.next();  //do something with e}

22

Page 23: Τεχνολογία Λογισμικού - NTUA · Περιεχόμενα 1. Visitor 2. Chain of responsibility 3. Command 4. Mediator 5. Memento 6. Strategy 7. Null Object 3

Iterablejava.lang.Iterable

interface Iterable<E> {  Iterator<E> iterator();}

23

Page 24: Τεχνολογία Λογισμικού - NTUA · Περιεχόμενα 1. Visitor 2. Chain of responsibility 3. Command 4. Mediator 5. Memento 6. Strategy 7. Null Object 3

Pull paradigmΟ χρήστης/client του Iterable κάνει pull για την επόμενη τιμή﴾καλεί τις hasNext/next﴿

24

Page 25: Τεχνολογία Λογισμικού - NTUA · Περιεχόμενα 1. Visitor 2. Chain of responsibility 3. Command 4. Mediator 5. Memento 6. Strategy 7. Null Object 3

Observer / ObservableΣκοπός: Να ενημερωνόμαστε για τις αλλαγές στην κατάστασηενός αντικειμένου

Σχέση 1‐Ν ﴾1 observable, πολλοί observers﴿

25

Page 26: Τεχνολογία Λογισμικού - NTUA · Περιεχόμενα 1. Visitor 2. Chain of responsibility 3. Command 4. Mediator 5. Memento 6. Strategy 7. Null Object 3

Observable ﴾Subject﴿java.util.Observable

class Observable {  void addObserver(Observer o);  void deleteObserver(Observer o);  boolean hasChanged();  void notifyObservers();  void notifyObservers(Object arg);}

26

Page 27: Τεχνολογία Λογισμικού - NTUA · Περιεχόμενα 1. Visitor 2. Chain of responsibility 3. Command 4. Mediator 5. Memento 6. Strategy 7. Null Object 3

Observerjava.util.Observer

interface Observer {  void update(Observable o, Object arg);}

27

Page 28: Τεχνολογία Λογισμικού - NTUA · Περιεχόμενα 1. Visitor 2. Chain of responsibility 3. Command 4. Mediator 5. Memento 6. Strategy 7. Null Object 3

Push paradigmΟ χρήστης/client του Observable ενημερώνεται για τηνεπόμενη τιμή ﴾το Observable κάνει push﴿

Publish/Subscribe

28

Page 29: Τεχνολογία Λογισμικού - NTUA · Περιεχόμενα 1. Visitor 2. Chain of responsibility 3. Command 4. Mediator 5. Memento 6. Strategy 7. Null Object 3

ΠαράδειγμαΤο knockout.js υποστηρίζει το Observer/Observable

29

Page 30: Τεχνολογία Λογισμικού - NTUA · Περιεχόμενα 1. Visitor 2. Chain of responsibility 3. Command 4. Mediator 5. Memento 6. Strategy 7. Null Object 3

CallbackΣκοπός: Να εκτελέσουμε ένα κομμάτι κώδικα αφού έχειολοκληρωθεί ένας υπολογισμός ﴾σύγχρονα ή ασύγχρονα﴿

30

Page 31: Τεχνολογία Λογισμικού - NTUA · Περιεχόμενα 1. Visitor 2. Chain of responsibility 3. Command 4. Mediator 5. Memento 6. Strategy 7. Null Object 3

Παράδειγμαinterface Callback {  void call()}

Θα μπορούσε να είναι και Runnable ή Callable

31

Page 32: Τεχνολογία Λογισμικού - NTUA · Περιεχόμενα 1. Visitor 2. Chain of responsibility 3. Command 4. Mediator 5. Memento 6. Strategy 7. Null Object 3

abstract class Task {  abstract void execute()    void executeAnd(Callback callback) {    execute()    callback.call()  }}

32

Page 33: Τεχνολογία Λογισμικού - NTUA · Περιεχόμενα 1. Visitor 2. Chain of responsibility 3. Command 4. Mediator 5. Memento 6. Strategy 7. Null Object 3

Πραγματικό παράδειγμαΤα Javascript callbacks ﴾π.χ. σε μια AJAX κλήση﴿

33

Page 34: Τεχνολογία Λογισμικού - NTUA · Περιεχόμενα 1. Visitor 2. Chain of responsibility 3. Command 4. Mediator 5. Memento 6. Strategy 7. Null Object 3

Callback hellgetData = function(param, callback){  $.get('http://example.com/get/'+param,    function(responseText){      callback(responseText);    });}

getData(0, function(a){  getData(a, function(b){    getData(b, function(c){      getData(c, function(d){        getData(d, function(e){         // ...        });      });    });  });});

34

Page 35: Τεχνολογία Λογισμικού - NTUA · Περιεχόμενα 1. Visitor 2. Chain of responsibility 3. Command 4. Mediator 5. Memento 6. Strategy 7. Null Object 3

Future / PromiseΣκοπός: Να διαχειριστούμε το αποτέλεσμα ενός υπολογισμού ﴾avalue that will eventually become available﴿ με ομοιόμορφο τρόπο,ανεξάρτητα του αν ο υπολογισμός γίνεται σύγχρονα ήασύγχρονα

35

Page 36: Τεχνολογία Λογισμικού - NTUA · Περιεχόμενα 1. Visitor 2. Chain of responsibility 3. Command 4. Mediator 5. Memento 6. Strategy 7. Null Object 3

Τρεις καταστάστεις

Pending ﴾not yet available﴿Fulfilled ﴾with an optional value﴿Rejected ﴾due to an error or a timeout, with an optional value﴿

Εκτέλεση

Thread pool ή Event loop

36

Page 37: Τεχνολογία Λογισμικού - NTUA · Περιεχόμενα 1. Visitor 2. Chain of responsibility 3. Command 4. Mediator 5. Memento 6. Strategy 7. Null Object 3

Διαφορές ανά γλώσσα ή frameworkFuture, Promise, Deferred, Delay

37

Page 38: Τεχνολογία Λογισμικού - NTUA · Περιεχόμενα 1. Visitor 2. Chain of responsibility 3. Command 4. Mediator 5. Memento 6. Strategy 7. Null Object 3

ΣυνήθωςFuture

Μια read‐only αναφορά σε μια τιμή που δεν έχει ακόμαυπολογιστεί ﴾o χρήστης του Future δεν έχει έλεγχο στην τιμή πουθα προκύψει﴿.

Promise ﴾CompletableFuture﴿

Μια single‐assignment μεταβλητή για την τιμή του Future ﴾oχρήστης του Promise μπορεί να θέσει άπαξ την τιμή που θαπροκύψει﴿.

38

Page 39: Τεχνολογία Λογισμικού - NTUA · Περιεχόμενα 1. Visitor 2. Chain of responsibility 3. Command 4. Mediator 5. Memento 6. Strategy 7. Null Object 3

Promise = a future with a public set method

39

Page 40: Τεχνολογία Λογισμικού - NTUA · Περιεχόμενα 1. Visitor 2. Chain of responsibility 3. Command 4. Mediator 5. Memento 6. Strategy 7. Null Object 3

Future στη JavaPackage java.util.concurrent

interface ExecutorService {  Future<V> submit(Callable<V> callable)}

Το  ExecutorService  είναι συνήθως κάποιο ThreadPool

40

Page 41: Τεχνολογία Λογισμικού - NTUA · Περιεχόμενα 1. Visitor 2. Chain of responsibility 3. Command 4. Mediator 5. Memento 6. Strategy 7. Null Object 3

interface Future<V> {  //Attempts to cancel execution of this computation.  boolean cancel(boolean mayInterruptIfRunning);    //Waits if necessary for the computation to complete,   //and then retrieves its result.  V get();

  //Waits if necessary for at most the given time for   //the computation to complete, and then retrieves   //its result, if available.   V get(long timeout, TimeUnit unit)

  //Returns true if this computation was cancelled before it  //completed normally.  boolean isCancelled()    //Returns true if this computation completed.  boolean isDone()}

41

Page 42: Τεχνολογία Λογισμικού - NTUA · Περιεχόμενα 1. Visitor 2. Chain of responsibility 3. Command 4. Mediator 5. Memento 6. Strategy 7. Null Object 3

Παράδειγμαclass Bulk {  private ExecutorService executor = //a thread pool  private List<Future> futures = []    void add(final Job job) {    Future f = executor.submit(new Callable<Void>() {      @Override      Void call() throws Exception {        job.execute();      }    });    futures.add(f);  }    void execute() {    for(Future f: futures) {      f.get(); //wait for all futures to complete    }  }}

42

Page 43: Τεχνολογία Λογισμικού - NTUA · Περιεχόμενα 1. Visitor 2. Chain of responsibility 3. Command 4. Mediator 5. Memento 6. Strategy 7. Null Object 3

ΧρήσηBulk bulk = new Bulk();bulk.add(job1);bulk.add(job2);bulk.add(job3);bulk.add(job4);bulk.add(job5);bulk.add(job6);bulk.execute();

43

Page 44: Τεχνολογία Λογισμικού - NTUA · Περιεχόμενα 1. Visitor 2. Chain of responsibility 3. Command 4. Mediator 5. Memento 6. Strategy 7. Null Object 3

Promise στην Javascript ﴾ES6﴿var handlerFunction = function(resolve, reject) {  //resolve is the function to call in case   //of successful completion    //reject is the function to call in case of  //failure};var promise = new Promise(handlerFunction);promise.       then(someFunction).   //gets the resolved value              catch(errorFunction); //gets the rejected value

44

Page 45: Τεχνολογία Λογισμικού - NTUA · Περιεχόμενα 1. Visitor 2. Chain of responsibility 3. Command 4. Mediator 5. Memento 6. Strategy 7. Null Object 3

Με το νέο συντακτικόvar promise = new Promise((resolve, reject) => {   try {    //perform a task (usually asynchronous)    resolve(task.result);  }  catch(e) {    reject(e);  }});

45

Page 46: Τεχνολογία Λογισμικού - NTUA · Περιεχόμενα 1. Visitor 2. Chain of responsibility 3. Command 4. Mediator 5. Memento 6. Strategy 7. Null Object 3

Πραγματικό παράδειγμαJQuery.ajax﴾...﴿ returns a promise

46