Professional Documents
Culture Documents
Lecture 11 - Design Patterns
Lecture 11 - Design Patterns
Τεχνολογία Λογισμικού
-Πρότυπα Σχεδίασης
Δομικά Πρότυπα
Πρότυπα Συμπεριφοράς
Δημιουργικά πρότυπα
Ανδρέας Λ. Συμεωνίδης
Τμήμα Ηλεκτρολόγων Μηχ/κών
&
Μηχ/κών Υπολογιστών, Α.Π.Θ.
Email:asymeon@eng.auth.gr
Παράδειγμα:
Εσύ:
1 5 3 8
Ο αντίπαλος
Ο αντίπαλος:
6 9 7 2 κερδίζει!
Γιατί;
– Πρέπει να σαρωθούν όλοι οι αριθμοί για να ελέγξεις αν
κέρδισες/ έχασες
– Είναι δύσκολο να προβλέψεις τι θα επιλέξει ο αντίπαλος αν
επιλέξετε συγκεκριμένο αριθμό
– Η επιλογή του αριθμού εξαρτάται από όλα τα προηγούμενα
νούμερα
– Δεν είναι εύκολο να επινοήσει κανείς έστω και μια απλή
στρατηγική
Source: http://boulter.com/ttt/index.cgi
Περίπτωση ισοπαλίας
Πρότυπα
που κερδίζουν
Συμμετρίες:
• Ο παίκτης χρειάζεται να θυμάται μόνο αυτά τα τρία μοτίβα
για να αντιμετωπίσει 12 διαφορετικές καταστάσεις
8 1 6
3 5 7
4 9 2
Εσύ: 1 5 3 8
Ο αντίπαλος: 6 9 7 2
8 1 6 8 1 6
3 5 7 3 5 7
4 9 2 4 9 2
Μοντελοποιώντας Ευριστικά
Δομικά Πρότυπα
– μειώνουν τη σύζευξη ανάμεσα σε δυο ή περισσότερες κλάσεις
– εισάγουν μια abstract κλάση για μελλοντικές επεκτάσεις
– εμπεριέχουν σύνθετες δομές
Πρότυπα συμπεριφοράς
– επιτρέπουν επιλογή ανάμεσα σε αλγορίθμους και ορισμό ευθυνών
ανάμεσα σε αντικείμενα (“Ποιος κάνει τι;”)
– χαρακτηρίζουν σύνθετες ροές ελέγχου, οι οποίες είναι δύσκολο να
παρακολουθηθούν κατά την εκτέλεση
Δημιουργικά Πρότυπα
– επιτρέπουν την αφαίρεση από σύνθετες διαδικασίες αρχικοποίησης
– κάνουν το σύστημα ανεξάρτητο από τον τρόπο με τον οποίο
δημιουργούνται, συνθέτονται και αναπαριστώνται τα αντικείμενα.
Πρότυπο
Πρότυπο
Δομικό Συμπεριφοράς Δημιουργικό
Πρότυπο Πρότυπο
Δομικά Πρότυπα
Πρότυπο
Πρότυπο
Δομικό Συμπεριφοράς Δημιουργικό
Πρότυπο Πρότυπο
Σύστημα *
Λογισμικού
Κλάση Υποσύστημα
Παιδιά
Software *
Lifecycle
Εργασία Δραστηριότητα
Παιδιά
Client Component *
Leaf Composite
Children
Operation() Operation()
AddComponent
RemoveComponent()
GetChild()
** **
Doors Wheels Battery Engine
** ** Department
University School
Composite
Δυναμικό δένδρο (αναδρομική συνάθροιση):
Program
Pattern
Dynamic tree (recursive aggregate):
**
** Block
Compound Simple
Statement Statement
Client Graphic *
Picture
Line Circle
Children
Draw()
Draw() Draw() Add(Graphic g)
RemoveGraphic)
GetChild(int)
Internal Project
Project Function Department Team
Work Product Deliverable
Το πρότυπο Προσαρμογέας
(Adapter Pattern)
“Μετασχηματίστε τη διεπαφή της κλάσης στη διεπαφή που
περιμένει ο πελάτης.”
Το πρότυπο του Προσαρμογέα επιτρέπει τη συνεργασία
κλάσεων που αλλιώς δεν θα μπορούσαν, λόγω ασύμβατων
διεπαφών
Χρησιμοποιείται για να παρέχει μια νέα διεπαφή σε υπάρχοντα
συστήματα (legacy components).
Είναι γνωστό και ως wrapper
Δυο είδη προτύπων Προσαρμογέα:
– Προσαρμογέας κλάσης (Class adapter):
Εφαρμόζει πολλαπλή κληρονομικότητα για να προσαρμόσει μια διεπαφή σε
μια άλλη
– Προσαρμογέας αντικειμένου (Object adapter):
Εφαρμόζει απλή κληρονομικότητα και εξουσιοδότηση
ClientInterface LegacyClass
Client
Request() ExistingRequest()
adaptee Εξουσιοδότηση
Κληρονομικότητα
Adapter
Request()
add(element) put(key,element)
adaptee
MySet
add(element)
adaptee
MyStringComparator
compare()
Το πρότυπο Γέφυρας
(Bridge Pattern)
Χρησιμοποιώντας τη Γέφυρα
Το πρότυπο γέφυρας χρησιμοποιείται για να παρέχει πολλές υλοποιήσεις
κάτω από την ίδια διεπαφή.
Παράδειγμα: Διεπαφή σε ένα τμήμα λογισμικού που είναι ημιτελές, μη
γνωστό, ή μη διαθέσιμο κατά τον έλεγχο του λογισμικού
Το έργο JAMES: αν τα δεδομένα για τη θέση πρέπει να αναγνωστούν,
αλλά η κλάση seat δεν έχει υλοποιηθεί ακόμη, ή έχει μόνο προσομοιωθεί,
υλοποιήστε μια γέφυρα:
Seat
(in Vehicle Subsystem) imp
VIP SeatImplementation
GetPosition()
SetPosition()
Το πρότυπο Γέφυρας
Client
Abstraction Implementor
imp
Operator() OperationImpl()
Imp ‐> OperationImp();
Arena
imp
LeagueStore LeagueStoreImplementor
Adapter vs Bridge
Ομοιότητες:
– Χρησιμοποιούνται για να κρύψουν της λεπτομέρειες της υλοποίησης.
Διαφορές:
– Το πρότυπο προσαρμογέα προσανατολίζεται στο να βάλει
ασυσχέτιστα τμήματα λογισμικού να δουλέψουν μαζί
Εφαρμόζεται σε συστήματα αφού έχουν σχεδιαστεί (reengineering, interface
engineering).
– Το πρότυπο γέφυρας, από την άλλη, εφαρμόζεται εκ των προτέρων για
να διαχωρίσει τις αφαιρέσεις από τις υλοποιήσεις.
Εξουσιοδότηση που ακολουθείται από κληρονομικότητα
Το πρότυπο Πρόσοψης
(Facade Pattern)
Παρέχει μια ενοποιημένη διεπαφή σε ένα σετ από αντικείμενα σε ένα
υποσύστημα.
Ένα facade ορίζει μια υψηλού επιπέδου διεπαφή, η οποία κάνει το
υποσύστημα πιο εύκολο στη χρήση
Τα πρότυπα Facade μας επιτρέπουν να παρέχουν κλειστές
αρχιτεκτονικές
Compiler Compiler
compile(s)
CodeGenerator Lexer
create()
getToken()
Optimizer Parser
create() generateParseTree()
ParseNode
create()
Παράδειγμα σχεδίασης
Το πρότυπο Εντολοδόχος
(Proxy Pattern): Το κίνητρο
Τι μπορώ να κάνω;
Το πρότυπο Proxy
Το πρότυπο Proxy
Subject
Request()
Proxy RealSubject
realSubject
Request() Request()
Image
boundingBox()
draw()
ProxyImage RealImage
boundingBox()
realSubject
boundingBox()
draw() draw()
Πριν
Μετά
Πρότυπα Συμπεριφοράς
Πρότυπο
Πρότυπο
Δομικό Συμπεριφοράς Δημιουργικό
Πρότυπο Πρότυπο
Πρότυπο Command
Command
Invoker
execute()
Client
<<binds>>
Receiver
ConcreteCommand
action()
execute()
ReplayedMatch Match *
Move
nextMove() play()
previousMove() execute()
replay()
«binds»
GameBoard TicTacToeMove
ChessMove
Το πρότυπο Παρατηρητής
(Observer Pattern)
Πρόβλημα:
– Έχουμε ένα αντικείμενο που αλλάζει την κατάστασή του ιδιαίτερα
συχνά
Παράδειγμα: Ένα πορτφόλιο μετοχών
– Θέλουμε να παρέχουμε πολλές όψεις της τρέχουσας κατάστασης του
πορτφόλιο
Παράδειγμα: Όψη ιστογράμματος, πίτας, γραμμής χρόνου κτλ
Απαιτήσεις:
– Το σύστημα πρέπει να διατηρεί τη συνοχή ανάμεσα στις όψεις, όποτε
και αν αλλάζει η κατάσταση του παρατηρούμενου αντικειμένου
– Η σχεδίαση του συστήματος πρέπει να είναι ιδιαίτερα επεκτάσιμη
Πρέπει να παρέχεται η δυνατότητα να προστίθενται νέες όψεις χωρίς να
χρειάζεται η επανα-μεταγλώττιση του αντικειμένου ή της όψης του
Πρότυπο Παρατηρητή
Observers
Αντικείμενο
9DesignPatterns2.ppt
subject ConcreteObserver
ConcreteSubject
subjectState observerState
getState()
setState(newState) update()
observers
Subject Observer
1 *
subscribe(Subscriber) update()
unsubscribe(Subscriber)
notify()
GameBoard MatchView
state gameBoard
getState() update()
playMove()
Πρότυπο Στρατηγικής
(Strategy Pattern)
Υπάρχουν πολλοί αλγόριθμοι για την ίδια εργασία
– Μπορούμε να εναλλάξουμε ανάμεσα σε αλγορίθμους σε χρόνο
εκτέλεσης
Παραδείγματα:
– Διαφορετικές στρατηγικές σύγκρουσης αντικειμένων σε video games
– Ταξινόμηση μιας λίστας πελατών (Bubble sort, mergesort, quicksort)
– Εφαρμογή διαφορετικού αλγορίθμου Εξόρυξης Δεδομένων πάνω στο
ίδιο σετ
Διαφορετικοί αλγόριθμοι είναι κατάλληλοι σε διαφορετικές περιπτώσεις
Αν χρειαζόμαστε έναν νέο αλγόριθμο, θέλουμε να μπορούμε να τον
προσθέσουμε εύκολα, χωρίς να χρειάζεται να ξανασχεδιάσουμε ολόκληρη
την εφαρμογή
Πρότυπο Στρατηγικής
Policy
Context * Strategy
ContextInterface() AlgorithmInterface
Database Strategy
Strategy *
Search() Sort()
Sort()
Πρότυπο Template
AbstractClass
templateMethod()
step1()
step2()
step3()
ConcreteClass
step1()
step2()
step3()
TestCase
run()
setUp() setUp();
runTest() try {
tearDown() runTest();
}
catch (Exception e){
recordFailure(e);
MyTestCase }
setUp() tearDown();
runTest()
tearDown()
Application
openDocument()
canOpenFile(f:File)
createDocument(f:File):Doc if (canOpenFile(f)) {
aboutToOpenDocument(d:Doc) Doc d;
d = createDocument(f);
aboutToOpenDocument(d);
d.open();
MyApplication
}
canOpenFile(f: File)
createDocument(f:File):Doc
aboutToOpenDocument(d:Doc)
Δημιουργικά Πρότυπα
Πρότυπο
Πρότυπο
Δομικό Συμπεριφοράς Δημιουργικό
Πρότυπο Πρότυπο
AbstractFactory AbstractProductA
Client
CreateProductA
CreateProductB
ProductA1 ProductA2
ConcreteFactory1 AbstractProductB
CreateProductA
CreateProductB
ProductB1 ProductB2
ConcreteFactory2
SiemensLight ZumbobelLight
Controller Controller
Blinds
SiemensFactory
InitLightSystem
InitBlindSystem
InitACSystem
SiemnensBlind ZumtobelBlind
Controller Controller
ZumtobelFactory
InitLightSystem
InitBlindsystem
InitACSystem
Α.Λ. Συμεωνίδης Τεχνολογία Λογισμικού 75
Το Πρότυπο Builder
Director Builder
Construct() BuildPart()
ConcreteBuilderB
BuildPart()
GetResult()
ConcreteBuilderA
BuildPart()
GetResult() Representation A
Σύνοψη
Σύνοψη (συν.)
Composite, Adapter, Bridge, Façade, Proxy
(Δομικά Πρότυπα)
– Στόχος: Σύνθεση αντικειμένων για τη δημιουργία μεγαλύτερων
δομών
Υλοποιούν νέα λειτουργικότητα από την παλιά
Παρέχουν ευελιξία και επεκτασιμότητα
Command, Observer, Strategy, Template
(Πρότυπα Συμπεριφοράς)
– Στόχος: Αλγόριθμοι και ανάθεση ευθυνών στα αντικείμενα
Αποφεύγουν την στενή σύζευξη σε συγκεκριμένες λύσεις
Abstract Factory, Builder (Δημιουργικά Πρότυπα)
– Στόχος: Δημιουργία σύνθετων αντικειμένων
Αποκρύπτουν πώς τα σύνθετα αντικείμενα δημιουργούνται και
συναρμολογούνται
Σύνοψη (συν.)
Πρότυπα σχεδίασης
– Παρέχουν λύσεις σε κοινά προβλήματα.
– Οδηγούν σε επεκτάσιμα μοντέλα και κώδικα.
– Μπορούν να χρησιμοποιηθούν αυτούσια ή ως
παραδείγματα κληρονομικότητας διεπαφών ή εξιοδότησης.
– Εφαρμόζουν τις ίδιες αρχές στη δομή και στη
συμπεριφορά.
Αναφορές