Μοτίβα σχεδίασης προσόψεων. Απομακρυσμένη πρόσοψη

Πριν διαβάσετε, διαβάστε τις ακόλουθες συμβάσεις και έννοιες. Αυτό το άρθρο ενημερώνεται με κάποια συχνότητα, οπότε αν το έχετε διαβάσει πριν, δεν είναι γεγονός ότι τα δεδομένα δεν έχουν αλλάξει.

Πρόσοψηανήκουν στην τάξη κατασκευαστικόςμοτίβα. Αντιπροσωπεύει μια ενοποιημένη διεπαφή αντί για ένα σύνολο διεπαφών ενός συγκεκριμένου υποσυστήματος. Το μοτίβο πρόσοψης ορίζει μια διεπαφή υψηλότερου επιπέδου που κάνει τα υποσυστήματα ευκολότερα στη χρήση.

Η διαίρεση ενός πολύπλοκου συστήματος σε υποσυστήματα σάς επιτρέπει να απλοποιήσετε τη διαδικασία σχεδιασμού και επίσης βοηθά στην ελαχιστοποίηση των εξαρτήσεων ενός υποσυστήματος από ένα άλλο. Ωστόσο, αυτό οδηγεί στο γεγονός ότι η χρήση τέτοιων υποσυστημάτων μαζί γίνεται αρκετά δύσκολη. Ένας τρόπος για να λυθεί αυτό το πρόβλημα είναι η εισαγωγή ενός μοτίβου πρόσοψης.

Αυτό είναι ένα από εκείνα τα μοτίβα που δεν έχουν σαφή υλοποίηση, αφού εξαρτάται από το συγκεκριμένο σύστημα. Γενικά, πρέπει να πραγματοποιήσουμε τον ακόλουθο μετασχηματισμό:

Το γκρι ορθογώνιο περιέχει τα υποσυστήματα μας, τα οποία έχουν κάποιες εξαρτήσεις μεταξύ τους (μπορεί να μην έχουν). Τα τρία επάνω μπλοκ υποδεικνύουν τα τρία τμήματα του κώδικα πελάτη στα οποία αλληλεπιδρά με αυτό το υποσύστημα. Το καθήκον μας είναι να δημιουργήσουμε μια απλή, ενοποιημένη διεπαφή μέσω της οποίας θα αρκούσε η αλληλεπίδραση με τα υποσυστήματα στο πλαίσιο της αποστολής,εκείνοι. δεν χρειάζεται να δημιουργήσουμε μια καθολική διεπαφή για όλες τις περιπτώσεις, καθώς στις περισσότερες περιπτώσεις αυτό είναι περιττό και οδηγεί σε πιο περίπλοκες αλληλεπιδράσεις και αυξημένο χρόνο ανάπτυξης.

Παρακάτω είναι ένα σκίτσο μιας υλοποίησης:

/** * SystemA */ class Bank ( δημόσια συνάρτηση OpenTransaction() () δημόσια συνάρτηση CloseTransaction() () δημόσια συνάρτηση transferMoney($amount) () ) /** * SystemB */ class Client ( δημόσια συνάρτηση OpenTransaction() ( ) δημόσια συνάρτηση CloseTransaction() () δημόσια συνάρτηση transferMoney($amount) () ) /** * SystemC */ class Log ( public function logTransaction() () ) class Facade ( δημόσια μεταφορά συνάρτησης($amount) ( $Bank = new Bank(); $Client = new Client(); $Log = new Log(); $Bank->OpenTransaction(); $Client->OpenTransaction(); $Log->logTransaction("Transaction open"); $ Τράπεζα->transferMoney(-$amount); $Log->logTransaction("Μεταφορά χρημάτων από τράπεζα"); $Client->transferMoney($amount); $Log->logTransaction("Μεταφορά χρημάτων στον πελάτη"); $Bank ->CloseTransaction(); $Client->CloseTransaction(); $Log->logTransaction("Κλείσιμο συναλλαγής"); ) ) // Κωδικός πελάτη $Transfer = new Facade(); $Transfer->transfer(1000);

Περιγραφή απομακρυσμένης πρόσοψης

Παρέχει μια κοινή ενοποιητική διεπαφή σε ένα σύνολο μεθόδων αντικειμένων για τη βελτίωση της αποτελεσματικότητας της δικτύωσης.

Το μοτίβο Remote Facade στο αντικειμενοστραφή μοντέλο βελτιώνει την εργασία με μικρά αντικείμενα που έχουν μικρές μεθόδους. Οι μικρές τεχνικές προσφέρουν μεγάλες ευκαιρίες για έλεγχο και αλλαγή συμπεριφοράς και βελτιώνουν την κατανόηση της εφαρμογής από τον πελάτη. Μια συνέπεια αυτής της λεπτομερούς συμπεριφοράς είναι ότι συνήθως υπάρχει μεγάλη αλληλεπίδραση μεταξύ αντικειμένων, με πολλές κλήσεις μεθόδων.

Σε έναν χώρο διευθύνσεων, οι «λεπτομερείς» αλληλεπιδράσεις λειτουργούν καλά, αλλά όλα αλλάζουν όταν συμβαίνει αλληλεπίδραση μεταξύ των διεργασιών. Οι απομακρυσμένες κλήσεις είναι πιο ακριβές γιατί πρέπει να γίνουν πολλά: μερικές φορές τα δεδομένα πρέπει να οργανωθούν, να ελέγχονται για ασφάλεια, τα πακέτα πρέπει να δρομολογούνται σε μεταγωγείς. Εάν δύο διαδικασίες λειτουργούν σε διαφορετικά άκρα του κόσμου, ακόμη και η ταχύτητα του φωτός μπορεί να παίξει κάποιο ρόλο. Η σκληρή αλήθεια είναι ότι οποιαδήποτε επικοινωνία μεταξύ των διεργασιών είναι τάξεις μεγέθους πιο σπάταλη από τις κλήσεις εντός της διαδικασίας. Ακόμα κι αν και οι δύο διαδικασίες εκτελούνται στο ίδιο μηχάνημα. Αυτός ο αντίκτυπος στην απόδοση δεν μπορεί να αγνοηθεί, ακόμη και από τεμπέληδες λάτρεις της βελτιστοποίησης.

Ως αποτέλεσμα, κάθε αντικείμενο που εμπλέκεται στην απομακρυσμένη χρήση χρειάζεται μια γενικότερη διεπαφή που ελαχιστοποιεί τον αριθμό των αιτημάτων που απαιτούνται για να γίνει κάτι. Αυτό επηρεάζει όχι μόνο μεθόδους, αλλά και αντικείμενα. Αντί να ζητάτε ένα τιμολόγιο και όλα τα στοιχεία του ξεχωριστά, πρέπει να διαβάσετε και να ενημερώσετε όλα τα στοιχεία τιμολογίου σε ένα αίτημα. Αυτό επηρεάζει ολόκληρη τη δομή του αντικειμένου. Πρέπει να ξεχάσουμε τον καλό σκοπό των μικρών αντικειμένων και των μικρών μεθόδων. Ο προγραμματισμός γίνεται όλο και πιο δύσκολος, η παραγωγικότητα πέφτει και πέφτει.

Το μοτίβο απομακρυσμένης πρόσοψης αντιπροσωπεύει μια γενική "Πρόσοψη" (σύμφωνα με το GoF) πάνω από μια δομή με πιο "λεπτοκόκκους" αντικείμενα. Κανένα από αυτά τα αντικείμενα δεν έχει απομακρυσμένη διεπαφή και η Απομακρυσμένη Πρόσοψη δεν περιλαμβάνει καμία επιχειρηματική λογική. Το μόνο που κάνει το Remote Facade είναι να μεταφράζει γενικά αιτήματα σε ένα σύνολο μικρών αιτημάτων για δευτερεύοντα αντικείμενα.

Τελευταία ενημέρωση: 31/10/2015

Η πρόσοψη είναι ένα σχέδιο σχεδίασης που κρύβει την πολυπλοκότητα ενός συστήματος παρέχοντας μια απλοποιημένη διεπαφή για την αλληλεπίδραση με αυτό.

Πότε να χρησιμοποιήσετε μια πρόσοψη;

    Όταν έχετε ένα πολύπλοκο σύστημα και πρέπει να απλοποιήσετε την εργασία με αυτό. Η πρόσοψη θα σας επιτρέψει να ορίσετε ένα σημείο αλληλεπίδρασης μεταξύ του πελάτη και του συστήματος.

    Όταν πρέπει να μειώσετε τον αριθμό των εξαρτήσεων μεταξύ του πελάτη και ενός πολύπλοκου συστήματος. Τα αντικείμενα πρόσοψης σάς επιτρέπουν να διαχωρίζετε, να απομονώνετε στοιχεία του συστήματος από τον πελάτη και να τα αναπτύσσετε και να εργάζεστε ανεξάρτητα.

    Όταν χρειάζεται να ορίσετε υποσυστήματα εξαρτημάτων σε ένα σύνθετο σύστημα. Η δημιουργία προσόψεων για τα στοιχεία κάθε μεμονωμένου υποσυστήματος θα απλοποιήσει την αλληλεπίδραση μεταξύ τους και θα αυξήσει την ανεξαρτησία τους μεταξύ τους.

Στο UML, το γενικό διάγραμμα μιας πρόσοψης μπορεί να αναπαρασταθεί ως εξής:

Ένας επίσημος ορισμός προγράμματος στην C# μπορεί να μοιάζει με αυτό:

Κλάση Υποσύστημα (δημόσιο κενό A1() () ) κλάση Υποσύστημα Β ( δημόσιο κενό Β1() () ) κλάση ΥποσύστημαC ​​( δημόσιο κενό C1() () ) δημόσια κλάση Πρόσοψη ( ΥποσύστημαΑ υποσύστημαΑ, Υποσύστημα Β υποσύστημα Β, Υποσύστημα Γ υποσύστημα Γ, δημόσια πρόσοψη(ΥποσύστημαΑ) sa, SubsystemB sb, SubsystemC sc) ( subsystemA = sa; subsystemB = sb; subsystemC = sc; ) public void Operation1() ( subsystemA.A1(); subsystemB.B1(); subsystemC.C1(); ) public void Operation2 () ( subsystemB.B1(); subsystemC.C1(); ) ) class Client ( public void Main() ( Facade Facade = new Facade(new SubsystemA(), new SubsystemB(), new SubsystemC()); πρόσοψη. Λειτουργία1(); πρόσοψη.Λειτουργία2(); ) )

Συμμετέχοντες

    Κλάσεις SubsystemA, SubsystemB, SubsystemC, κ.λπ. αποτελούν στοιχεία ενός πολύπλοκου υποσυστήματος με το οποίο ο πελάτης πρέπει να αλληλεπιδράσει

    Ο πελάτης αλληλεπιδρά με στοιχεία υποσυστήματος

    Πρόσοψη - απευθείας μια πρόσοψη που παρέχει μια διεπαφή στον πελάτη για εργασία με εξαρτήματα

Ας εξετάσουμε τη χρήση του μοτίβου σε ένα πραγματικό πρόβλημα. Νομίζω ότι οι περισσότεροι προγραμματιστές θα συμφωνήσουν μαζί μου ότι η σύνταξη κώδικα στο Visual Studio είναι ευχάριστη σε σύγκριση με το πώς γράφτηκε ο κώδικας πριν από την εμφάνιση των ενσωματωμένων περιβαλλόντων ανάπτυξης. Απλώς γράφουμε τον κωδικό, πατάμε ένα κουμπί και αυτό είναι - η εφαρμογή είναι έτοιμη. Σε αυτήν την περίπτωση, το IDE είναι μια πρόσοψη που κρύβει την πολυπλοκότητα της μεταγλώττισης και της εκτέλεσης μιας εφαρμογής. Τώρα ας περιγράψουμε αυτήν την πρόσοψη σε ένα πρόγραμμα C#:

Πρόγραμμα τάξης ( static void Main (string args) ( TextEditor textEditor = new TextEditor(); Compiller Compiller = new Compiller(); CLR clr = new CLR(); VisualStudioFacade ide = new VisualStudioFacade(textEditor, compiller, clr); Προγραμματιστής προγραμματιστής = new Programmer(); programmer.CreateApplication(ide); Console.Read(); ) ) // class editor text TextEditor ( public void CreateCode() ( Console.WriteLine ("Writing Code"); ) public void Save() ( Console.WriteLine("Αποθήκευση κώδικα"); ) ) class Compiller ( public void Compile() ( Console.WriteLine("Compiling an application"); ) ) class CLR ( public void Execute() ( Console.WriteLine("Executing μια εφαρμογή ")); textEditor = te, this.compiller = compil, this.clr = clr, ) public void Start() ( textEditor.CreateCode(); textEditor.Save(); compiller.Compile(); clr.Execute(); ) public void Stop() ( clr.Finish(); ) ) class Programmer ( public void CreateApplication(VisualStudioFacadefacade) (facade.Start();facade.Stop();) )

Σε αυτήν την περίπτωση, τα στοιχεία του συστήματος είναι η κλάση TextEditor, η κατηγορία Compiller και η κλάση χρόνου εκτέλεσης κοινής γλώσσας CLR. Ο πελάτης είναι η κλάση προγραμματιστή, η πρόσοψη είναι η κλάση VisualStudioFacade, η οποία, μέσω των μεθόδων της, αναθέτει την εργασία στα στοιχεία και τις μεθόδους τους.

Θα πρέπει να ληφθεί υπόψη ότι ο πελάτης μπορεί, εάν είναι απαραίτητο, να έχει απευθείας πρόσβαση στα στοιχεία, για παράδειγμα, να χρησιμοποιήσει ένα πρόγραμμα επεξεργασίας κειμένου ξεχωριστά από άλλα στοιχεία. Αλλά λόγω της πολυπλοκότητας της διαδικασίας δημιουργίας μιας εφαρμογής, είναι καλύτερο να χρησιμοποιήσετε μια πρόσοψη. Επίσης, αυτή δεν είναι η μόνη δυνατή πρόσοψη για εργασία με αυτά τα εξαρτήματα. Εάν είναι απαραίτητο, μπορείτε να δημιουργήσετε εναλλακτικές προσόψεις, όπως και στην πραγματική ζωή μπορούμε να χρησιμοποιήσουμε εναλλακτικά περιβάλλοντα ανάπτυξης.

Το βιβλίο GoF περιγράφει αυτό πρότυποως παροχή μιας ενοποιημένης διεπαφής σε πολλαπλές διεπαφές σε κάποιο υποσύστημα. Βιβλίο " Σχεδιαστικά πρότυπα"δίνει την ίδια ερμηνεία και εφιστά την προσοχή στο γεγονός ότι, κρύβοντας την πολυπλοκότητα του υποσυστήματος, το μοτίβο" Πρόσοψη" ενώ παρέχει όλες τις δυνατότητες του υποσυστήματος μέσω μιας εύχρηστης διεπαφής.

Για ένα απλό πρακτικό παράδειγμα του πώς λειτουργεί το σχέδιο Πρόσοψης, φανταστείτε ένα πλυντήριο με δύο μόνο κύκλους πλύσης: για πολύ λερωμένα ρούχα και για ελαφρώς λερωμένα ρούχα.

Για κάθε λειτουργία, το πλυντήριο πρέπει να εκτελεί ένα προκαθορισμένο σύνολο λειτουργιών: ρυθμίστε τη θερμοκρασία του νερού, ζεστάνετε το νερό, ρυθμίστε τη διάρκεια του κύκλου πλύσης, προσθέστε απορρυπαντικό ρούχων, προσθέστε χλωρίνη, προσθέστε μαλακτικό κ.λπ. Κάθε λειτουργία απαιτεί διαφορετικό σύνολο οδηγιών πλύσης (διαφορετικές ποσότητες απορρυπαντικού, υψηλότερη/χαμηλότερη θερμοκρασία, μεγαλύτερος/μικρότερος κύκλος στυψίματος κ.λπ.).

Η απλή διεπαφή παρέχει δύο τρόπους πλύσης, κρύβοντας τη σύνθετη λογική της επιλογής της κατάλληλης θερμοκρασίας νερού, διάρκειας στυψίματος και κύκλου πλύσης, καθώς και διαφορετικές μεθόδους για την προσθήκη απορρυπαντικού πλυντηρίου, χλωρίνης ή μαλακτικού ρούχων.

Ο χρήστης ενός πλυντηρίου δεν χρειάζεται να σκέφτεται την περίπλοκη λογική του πλυσίματος των πραγμάτων (επιλογή θερμοκρασίας, διάρκεια κύκλου κ.λπ.). Το μόνο πράγμα που πρέπει να κάνει ο χρήστης είναι να αποφασίσει εάν τα ρούχα είναι πολύ λερωμένα ή όχι. Αυτό είναι ουσία του μοτίβου "Facade".σε σχέση με τον σχεδιασμό των πλυντηρίων ρούχων.

Μοτίβο "Πρόσοψη"συνήθως εφαρμόζεται για τους ακόλουθους σκοπούς και περιπτώσεις:

  • να παρέχει απλή και ενοποιημένη πρόσβαση στο παλαιού τύπου σύστημα διαχείρισης παραγωγής·
  • για να δημιουργήσετε ένα δημόσιο API για κλάσεις όπως πρόγραμμα οδήγησης.
  • για την παροχή χονδροειδούς πρόσβασης στις διαθέσιμες υπηρεσίες. Οι υπηρεσίες ομαδοποιούνται όπως στο παραπάνω παράδειγμα πλυντηρίου.
  • για να μειώσετε τον αριθμό των κλήσεων δικτύου. Η πρόσοψη πραγματοποιεί πολλαπλές κλήσεις στο υποσύστημα, ενώ ο απομακρυσμένος πελάτης πρέπει να πραγματοποιήσει μία κλήση στην πρόσοψη.
  • για να ενσωματώσει τη ροή εργασίας και τις εσωτερικές λεπτομέρειες μιας εφαρμογής για να εξασφαλίσει απλότητα και ασφάλεια.

Παρεμπιπτόντως, προσόψειςεπίσης μερικές φορές υλοποιούνται ως αφηρημένα εργοστάσια singleton.

Διάγραμμα κλάσης πρόσοψης. Όπως φαίνεται στο διάγραμμα τάξης στο Εικ.3.1, Το μοτίβο Πρόσοψης παρέχει μια απλή διεπαφή στο υποκείμενο σύστημα, ενώ συγκεντρώνει περίπλοκη λογική.

Εικ. 3.1. Διάγραμμα τάξης του μοτίβου "Facade".

Πρόσοψηείναι ένα μοτίβο δομικής σχεδίασης που παρέχει μια απλή διεπαφή σε ένα σύνθετο σύστημα κλάσης, βιβλιοθήκη ή πλαίσιο.

Πρόβλημα

Ο κώδικάς σας πρέπει να λειτουργεί με μεγάλο αριθμό αντικειμένων από κάποια πολύπλοκη βιβλιοθήκη ή πλαίσιο. Πρέπει να αρχικοποιήσετε αυτά τα αντικείμενα μόνοι σας, να βεβαιωθείτε ότι οι εξαρτήσεις είναι στη σωστή σειρά και ούτω καθεξής.

Ως αποτέλεσμα, η επιχειρηματική λογική των τάξεων σας είναι στενά συνυφασμένη με τις λεπτομέρειες υλοποίησης κλάσεων τρίτων. Ένας τέτοιος κώδικας είναι αρκετά δύσκολο να κατανοηθεί και να διατηρηθεί.

Λύση

Μια πρόσοψη είναι μια απλή διεπαφή για εργασία με ένα σύνθετο υποσύστημα που περιέχει πολλές κλάσεις. Η πρόσοψη μπορεί να έχει μια απογυμνωμένη διεπαφή που δεν έχει το 100% της λειτουργικότητας που μπορεί να επιτευχθεί με τη χρήση ενός πολύπλοκου υποσυστήματος απευθείας. Παρέχει όμως ακριβώς εκείνα τα χαρακτηριστικά που χρειάζεται ο πελάτης και κρύβει όλα τα υπόλοιπα.

Η πρόσοψη είναι χρήσιμη εάν χρησιμοποιείτε κάποια περίπλοκη βιβλιοθήκη με πολλά κινούμενα μέρη, αλλά χρειάζεστε μόνο μέρος των δυνατοτήτων της.

Για παράδειγμα, ένα πρόγραμμα που ανεβάζει βίντεο με γάτες στα κοινωνικά δίκτυα μπορεί να χρησιμοποιήσει μια επαγγελματική βιβλιοθήκη συμπίεσης βίντεο. Αλλά το μόνο που χρειάζεται ο κώδικας πελάτη για αυτό το πρόγραμμα είναι μια απλή μέθοδος κωδικοποίησης (όνομα αρχείου, μορφή). Δημιουργώντας μια τάξη με αυτή τη μέθοδο, υλοποιείτε την πρώτη σας πρόσοψη.

Αναλογία από τη ζωή


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

Δομή



    Πρόσοψηπαρέχει γρήγορη πρόσβαση σε ορισμένες λειτουργίες υποσυστήματος. «Ξέρει» ποιες κλάσεις πρέπει να προωθήσουν το αίτημα και ποια δεδομένα χρειάζονται για αυτό.

    Πρόσθετη πρόσοψημπορεί να εισαχθεί για να μην «μπουκώσει» την ενιαία πρόσοψη με ετερογενή λειτουργικότητα. Μπορεί να χρησιμοποιηθεί τόσο από τον πελάτη όσο και από άλλες προσόψεις.

    Πολύπλοκο υποσύστημααποτελείται από πολλές διαφορετικές τάξεις. Για να τους αναγκάσετε να κάνουν κάτι, πρέπει να γνωρίζετε τις λεπτομέρειες της δομής του υποσυστήματος, τη σειρά αρχικοποίησης των αντικειμένων και ούτω καθεξής.

    Οι τάξεις υποσυστήματος δεν γνωρίζουν την ύπαρξη της πρόσοψης και συνεργάζονται άμεσα μεταξύ τους.

    Πελάτηςχρησιμοποιεί μια πρόσοψη αντί να εργάζεται άμεσα με αντικείμενα ενός πολύπλοκου υποσυστήματος.

Ψευδοκώδικας

Σε αυτό το παράδειγμα Πρόσοψηαπλοποιεί την εργασία με ένα σύνθετο πλαίσιο μετατροπής βίντεο.


Ένα παράδειγμα απομόνωσης πολλαπλών εξαρτήσεων σε μία πρόσοψη.

Αντί να εργάζεται απευθείας με μια ντουζίνα τάξεις, η πρόσοψη παρέχει στον κώδικα εφαρμογής μια ενιαία μέθοδο μετατροπής βίντεο, η οποία φροντίζει η ίδια να διαμορφώνει σωστά τα απαραίτητα αντικείμενα πλαισίου και να αποκτά το απαιτούμενο αποτέλεσμα.

// Τάξεις για ένα σύνθετο πλαίσιο μετατροπής βίντεο τρίτων κατασκευαστών. Εμείς // δεν ελέγχουμε αυτόν τον κώδικα, επομένως δεν μπορούμε να τον απλοποιήσουμε. class VideoFile // ... class OggCompressionCodec // ... class MPEG4CompressionCodec // ... class CodecFactory // ... class BitrateReader // ... class AudioMixer // ... // Αντ' αυτού, δημιουργούμε μια πρόσοψη - μια απλή διεπαφή για εργασία // με ένα σύνθετο πλαίσιο. Η πρόσοψη δεν έχει όλη τη λειτουργικότητα // του πλαισίου, αλλά κρύβει την πολυπλοκότητά της από τους πελάτες. class VideoConverter είναι η μέθοδος μετατροπή (όνομα αρχείου, μορφή): Το αρχείο είναι αρχείο = νέο VideoFile(όνομα αρχείου) sourceCodec = νέο CodecFactory.extract(file) if (format == "mp4") destinationCodec = νέο MPEG4CompressionCodec() αλλιώς destinationCodec = νέο OggCompressionCodec( ) buffer = BitrateReader.read(filename, sourceCodec) result = BitrateReader.convert(buffer, destinationCodec) result = (new AudioMixer()).fix(result) return new File(result) // Η εφαρμογή δεν εξαρτάται από σύνθετο πλαίσιο μετατροπής / / βίντεο. Παρεμπιπτόντως, εάν αποφασίσετε ξαφνικά να αλλάξετε το πλαίσιο, // θα χρειαστεί να ξαναγράψετε μόνο την κλάση πρόσοψης. class Η εφαρμογή είναι μέθοδος main() είναι μετατροπέας = νέος VideoConverter() mp4 = convertor.convert("funny-cats-video.ogg", "mp4") mp4.save()

Εφαρμογή

Όταν χρειάζεται να παρουσιάσετε μια απλή ή απογυμνωμένη διεπαφή σε ένα σύνθετο υποσύστημα.

Συχνά τα υποσυστήματα γίνονται πιο περίπλοκα καθώς το πρόγραμμα εξελίσσεται. Η εφαρμογή των περισσότερων μοτίβων έχει ως αποτέλεσμα την εμφάνιση μικρότερων τάξεων, αλλά σε μεγαλύτερους αριθμούς. Είναι ευκολότερο να επαναχρησιμοποιηθεί ένα τέτοιο υποσύστημα, προσαρμόζοντάς το κάθε φορά για συγκεκριμένες ανάγκες, αλλά ταυτόχρονα, γίνεται πιο δύσκολη η χρήση του υποσυστήματος χωρίς προσαρμογή. Η πρόσοψη προσφέρει έναν συγκεκριμένο τύπο συστήματος από προεπιλογή, που ταιριάζει στους περισσότερους πελάτες.

Όταν θέλετε να αποσυνθέσετε ένα υποσύστημα σε ξεχωριστά επίπεδα.

Χρησιμοποιήστε προσόψεις για να ορίσετε σημεία εισόδου σε κάθε επίπεδο του υποσυστήματος. Εάν τα υποσυστήματα εξαρτώνται το ένα από το άλλο, τότε η εξάρτηση μπορεί να απλοποιηθεί επιτρέποντας στα υποσυστήματα να ανταλλάσσουν πληροφορίες μόνο μέσω προσόψεων.

Για παράδειγμα, ας πάρουμε το ίδιο πολύπλοκο σύστημα μετατροπής βίντεο. Θέλετε να το αναλύσετε σε επίπεδα εργασίας ήχου και βίντεο. Για καθένα από αυτά τα μέρη, μπορείτε να προσπαθήσετε να δημιουργήσετε μια πρόσοψη και να βάλετε τις τάξεις επεξεργασίας ήχου και βίντεο να επικοινωνούν μεταξύ τους μέσω αυτών των προσόψεων και όχι απευθείας.

Βήματα υλοποίησης

    Προσδιορίστε εάν είναι δυνατή η δημιουργία μιας απλούστερης διεπαφής από αυτή που παρέχεται από το σύνθετο υποσύστημα. Είστε στο σωστό δρόμο, εάν αυτή η διεπαφή εξαλείφει την ανάγκη να γνωρίζει ο πελάτης λεπτομέρειες σχετικά με το υποσύστημα.

    Δημιουργήστε μια κλάση πρόσοψης που υλοποιεί αυτήν τη διεπαφή. Πρέπει να προωθήσει κλήσεις πελάτη στα σωστά αντικείμενα υποσυστήματος. Η πρόσοψη θα πρέπει να φροντίσει να προετοιμάσει σωστά τα αντικείμενα του υποσυστήματος.

    Θα έχετε το μέγιστο όφελος εάν ο πελάτης εργάζεται μόνο με την πρόσοψη. Σε αυτήν την περίπτωση, οι αλλαγές στο υποσύστημα θα επηρεάσουν μόνο τον κωδικό πρόσοψης και ο κωδικός πελάτη θα παραμείνει σε λειτουργία.