7 / 9 201819 - - PowerPoint PPT Presentation

7 9 2018 19 nickie softlab ntua gr
SMART_READER_LITE
LIVE PREVIEW

7 / 9 201819 - - PowerPoint PPT Presentation

& / 7 / 9 201819 .,


slide-1
SLIDE 1

Σχολή Ηλεκτρολόγων Μηχανικών & Μηχανικών Η/Υ Εθνικό Μετσόβιο Πολυτεχνείο

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

7ο / 9ο Εξάμηνο 2018‐19 Ν.Παπασπύρου, Αν.Καθ. ΣΗΜΜΥ, nickie@softlab.ntua,gr Β.Βεσκούκης, Αν.Καθ. ΣΑΤΜ, v.vescoukis@cs.ntua,gr Κ.Σαΐδης, ΠΔ 407, saiko@softlab.ntua.gr

slide-2
SLIDE 2

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

Πρότυπα σχετικά με τη δομή και τη συσχέτιση κλάσεων

2

slide-3
SLIDE 3

Περιεχόμενα

  • 1. Adapter ﴾Wrapper﴿
  • 2. Bridge
  • 3. Composite
  • 4. Decorator
  • 5. Facade
  • 6. Proxy

3

slide-4
SLIDE 4

Adapter ﴾Wrapper﴿

Σκοπός: Να κάνει μια κλάση συμβατή με κάποιο interface που αναμένει ένας χρήστης της Μια υπάρχουσα κλάση γίνεται συμβατή με ένα νέο interface

4

slide-5
SLIDE 5

Παράδειγμα

java.lang.Runnable

public interface Runnable { public void run() }

java.util.concurrent.Callable

public interface Callable<V> { public V call() throws Exception } 5

slide-6
SLIDE 6

public class RunnableAsCallable implements Callable<Void> { private final Runnable runnable; public RunnableAsCallable(Runnable runnable) { this.runnable = runnable; } @Override public Void call() throws Exception{ runnable.run(); return null; } } 6

slide-7
SLIDE 7

Συζήτηση

Μηχανισμός για να κάνουμε δύο ξεχωριστά συστατικά ﴾με διαφορετικό σχεδιασμό﴿ να λειτουργήσουν μαζί, αφού έχουν υλοποιηθεί. "Ντύνουμε" ένα interface με τα ρούχα ένός άλλου.

7

slide-8
SLIDE 8

Bridge

Σκοπός: Να διαχωρίσουμε την αφαίρεση ﴾interface﴿ από την υλοποίηση ﴾class﴿, ώστε να χρησιμοποιούνται ανεξάρτητα.

8

slide-9
SLIDE 9

Παράδειγμα

Δύο βασικές έννοιες Thread scheduler Platform

9

slide-10
SLIDE 10

Παράδειγμα ﴾Subclassing﴿

ThreadScheduler PreemptiveThreadScheduler TimeSlicedThreadScheduler UnixTSTS WindowsTSTS WindowsPTS UnixPTS 10

slide-11
SLIDE 11

Παράδειγμα ﴾Subclassing﴿

ThreadShceduler PreemptiveThreadScheduler TimeSlicedThreadScheduler UnixTSTS WindowsTSTS WindowsPTS UnixPTS JVM_TSTS JVM_PTS

11

slide-12
SLIDE 12

Παράδειγμα ﴾Bridge﴿

ThreadScheduler PreemptiveThreadScheduler TimeSlicedThreadScheduler WindowsPTS UnixPTS JVM_PTS ThreadScheduler_Implementation

12

slide-13
SLIDE 13

Συζήτηση

Έμφαση στη σύνθεση και όχι στην κληρονομικότητα Χρήση δύο ιεραρχιών κληρονομικότητας: μία "δημόσια" και μία "ιδιωτική" Οι "δημόσιες" αφαιρέσεις χρησιμοποιούν τις "ιδιωτικές" υλοποιήσεις Οι δύο ιεραρχίες μπορούν να εξελιχθούν ανεξάρτητα μεταξύ τους

13

slide-14
SLIDE 14

Composite

Σκοπός: Να επιτρέψουμε σε μια κλάση‐χρήστη να χειρίζεται απλά και σύνθετα αντικείμενα με ομοιόμορφο τρόπο

14

slide-15
SLIDE 15

Παράδειγμα

interface Resolver { File resolve(String text) throws NotFoundException; } class LocalFileResolver implements Resolver { ... } class URLResolver implements Resolver { ... } 15

slide-16
SLIDE 16

class CompositeResolver implements Resolver { private final Resolver[] resolvers; CompositeResolver(Resolver... r) { this.resolvers = r; } File resolve(text) throws NotFoundException { File f = null; for(resolver: resolvers) { try { f = resolver.resolve(text); } catch(NotFoundException nfe) { .. } if (f == null) { throw new NotFoundException(text); } else { return f; } } } } 16

slide-17
SLIDE 17

Decorator

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

17

slide-18
SLIDE 18

Παράδειγμα

Τέσσερις βασικές έννοιες Window Horizontal Scrollbar Vertical Scrollbar Border

18

slide-19
SLIDE 19

Παράδειγμα ﴾Subclassing﴿

Window +draw() Window_With_Vertical_Scrollbar Window_With_Border Window_With_Vertical_and_Horizontal_Scrollbar Window_With_Horizontal_Scrollbar Window_With_Vertical_and_Horizontal_Scrollbar_and_Border

19

slide-20
SLIDE 20

Παράδειγμα ﴾Decorator﴿

Window +draw() Decorator +draw() «interface» LCD +draw() HorizontalSB Border VerticalSB 20

slide-21
SLIDE 21

Widget w = new BorderDecorator( new HorizontalScrollBarDecorator( new VerticalScrollBarDecorator( new Window("Title") ) ) ); w.draw(); 21

slide-22
SLIDE 22

Συζήτηση

Παρέχει μια πιο ευέλικτη εναλλακτική για την προσθήκη λειτουργικότητας σε μια κλάση σε σχέση με το subclassing ﴾κληρονομικότητα﴿ Recursive wrapping

22

slide-23
SLIDE 23

Πραγματικό παράδειγμα ﴾Java IO﴿

OutputStream os = new BufferedOutputStream( new FileOutputStream("/path/to/file") ); 23

slide-24
SLIDE 24

Facade

Σκοπός: Να παρασχεθεί ένα απλό interface σε ένα σύνθετο υποσύστημα.

24

slide-25
SLIDE 25

Παράδειγμα

class VideoManagerFacade { File convert(String fileName, String format) { VideoFile file = new VideoFile(fileName); Codec srcCodec = CodecFactory.of(file); Codec destCodec; if (format.equals("ogg")) { destCodec = new OggCompressionCodec(); } else { destCodec = new MPEG4CompressionCodec(); } VideoFile buffer = BitrateReader.read(file, srcCodec); VideoFile tmp = BitrateReader.convert(buffer, destCodec); File result = (new AudioMixer()).fix(tmp); return result; } } 25

slide-26
SLIDE 26

Proxy

Σκοπός: Να προσφέρει έναν ενδιάμεσο για ένα άλλο αντικείμενο, ελέγχοντας την πρόσβαση σε αυτό

26

slide-27
SLIDE 27

Εφαρμογές

Οκνηρή αρχικοποίηση ﴾virtual proxy﴿ Έλεγχος πρόσβασης ﴾access proxy﴿ Εκτέλεση απομακρυσμένων υπηρεσιών ﴾remote proxy﴿ Χρήση ενδιάμεσης μνήμη ﴾caching﴿ Καταγραφή ενεργειών ﴾logging proxy﴿

27

slide-28
SLIDE 28

Παράδειγμα

class Router { void setup() { route("/index.html", new PublicResource()) route("/cart.html", new ProtectedResource()) } void service(HttpRequest req, HttpResponse res) { MVCResource res = getResourceFor(req) LoggingProxy proxy = new LoggingProxy(res) proxy.doService(req, res) } } 28

slide-29
SLIDE 29

class LoggingProxy extends MVCResource { private static final Logger log = ... private final MVCResource resource; LoggingProxy(MVCResource resource) { this.resource = resource; } User createUser(HttpRequest req) { return res.createUser } void doService(HttpRequest req, HttpResponse res) { log.log("Starting service of $resource") long t = System.currentTimeMillis() try { resource.doService(req, res) } finally { t = System.currentTimeMillis() ‐ t log.log("Ending service of $resource (duration $t ms)") } } } 29