Κοινή χρήση τεχνολογίας

Σύνοψη προτύπων σχεδίασης λογισμικού

2024-07-12

한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina

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

Δημιουργικά Μοτίβα

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

  1. Μονόχρωμο μοτίβο

    • Βεβαιωθείτε ότι υπάρχει μόνο μία παρουσία μιας κλάσης και παρέχετε ένα παγκόσμιο σημείο πρόσβασης.
  2. Μοτίβο μεθόδου εργοστασίου

    • Καθορίστε τη διεπαφή για τη δημιουργία αντικειμένων και αφήστε τις υποκλάσεις να αποφασίσουν ποια κλάση θα δημιουργήσουν στιγμιότυπο.
  3. Abstract Factory Pattern (Abstract Factory)

    • Δημιουργήστε οικογένειες σχετικών ή εξαρτημένων αντικειμένων χωρίς να προσδιορίζετε ρητά συγκεκριμένες κλάσεις.
  4. Μοτίβο δόμησης (Δόμηση)

    • Κατασκευάστε ένα σύνθετο αντικείμενο και επιτρέψτε την κατασκευή βήμα προς βήμα.
  5. Πρωτότυπο

    • Δημιουργήστε μια νέα παρουσία αντιγράφοντας μια υπάρχουσα παρουσία, αντί να δημιουργήσετε μια νέα.

Δομικά Μοτίβα

Αυτά τα μοτίβα ασχολούνται με συνδυασμούς αντικειμένων ή σχέσεις μεταξύ αντικειμένων και αυτών.

  1. Λειτουργία προσαρμογέα

    • Επιτρέπει την επίλυση ασυμβατοτήτων διεπαφής μεταξύ αντικειμένων μέσω ενός "προσαρμογέα".
  2. Μοτίβο διακοσμητή (Διακοσμητής)

    • Προσθέστε δυναμικά πρόσθετες ευθύνες σε ένα αντικείμενο.
  3. Λειτουργία διακομιστή μεσολάβησης (Proxy)

    • Παρέχει ένα stand-in ή ένα σύμβολο κράτησης θέσης για ένα άλλο αντικείμενο για τον έλεγχο της πρόσβασης σε αυτό.
  4. Πρόσοψη

    • Παρέχει μια ενοποιημένη διεπαφή υψηλού επιπέδου για την πρόσβαση σε μια ομάδα διεπαφών στο υποσύστημα.
  5. Λειτουργία γέφυρας (Bridge)

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

    • Ομαδοποιήστε τα αντικείμενα σε μια δομή δέντρου για να αναπαραστήσουν μια ιεραρχία μέρους-ολόκληρης.
  7. Λειτουργία flyweight

    • Υποστηρίξτε αποτελεσματικά μεγάλο αριθμό λεπτών αντικειμένων μέσω της κοινής χρήσης.

Μοτίβα συμπεριφοράς

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

  1. Στρατηγική

    • Ορίστε μια σειρά αλγορίθμων, ενθυλακώστε τους έναν προς έναν και κάντε τους εναλλάξιμους.
  2. Μοτίβο μεθόδου προτύπου (Μέθοδος προτύπου)

    • Καθορίστε το πλαίσιο του αλγορίθμου στη μέθοδο και αναβάλετε την υλοποίηση σε υποκλάσεις.
  3. Μοτίβο παρατηρητή (Παρατηρητής)

    • Σχέση εξάρτησης ένα προς πολλά μεταξύ αντικειμένων Όταν ένα αντικείμενο αλλάζει κατάσταση, όλα τα αντικείμενα που εξαρτώνται από αυτό θα ειδοποιούνται και θα ενημερώνονται αυτόματα.
  4. Μοτίβο Iterator (Iterator)

    • Προσπελάστε μεμονωμένα στοιχεία σε ένα συγκεντρωτικό αντικείμενο διαδοχικά χωρίς να εκθέσετε την εσωτερική του αναπαράσταση.
  5. Μοντέλο Αλυσίδας Ευθύνης

    • Δώστε την ευκαιρία σε πολλά αντικείμενα να χειριστούν το αίτημα, αποφεύγοντας έτσι τη σύζευξη μεταξύ του αποστολέα και του παραλήπτη του αιτήματος.
  6. Λειτουργία εντολών (Command)

    • Ενσωματώνει το αίτημα ως αντικείμενο, επιτρέποντας στον χρήστη να παραμετροποιήσει τον πελάτη με διαφορετικά αιτήματα.
  7. Λειτουργία Memento

    • Καταγράψτε την εσωτερική κατάσταση ενός αντικειμένου και αποθηκεύστε αυτήν την κατάσταση εκτός του αντικειμένου χωρίς να σπάσει η ενθυλάκωση.
  8. Λειτουργία κατάστασης

    • Επιτρέπει σε ένα αντικείμενο να αλλάξει τη συμπεριφορά του όταν αλλάζει η εσωτερική του κατάσταση.
  9. Λειτουργία επισκέπτη

    • Προσθέστε νέες δυνατότητες σε μια δομή αντικειμένου (όπως μια σύνθετη δομή).
  10. Μοτίβο διαμεσολαβητή

    • Ορίστε ένα ενδιάμεσο αντικείμενο για να απλοποιήσετε την αλληλεπίδραση μεταξύ των αρχικών αντικειμένων.
  11. Λειτουργία διερμηνέα (Διερμηνέας)

    • Ορίστε μια γραμματική αναπαράσταση μιας γλώσσας και ερμηνεύστε τις προτάσεις που ορίζονται σε αυτήν τη γλώσσα.

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

Για παράδειγμα

class PubSub {
  constructor() {
    this.events = {}; // 存储事件名称和对应的订阅者回调函数数组
  }

  // 订阅事件
  subscribe(event, callback) {
    if (!this.events[event]) {
      this.events[event] = []; // 如果事件不存在,初始化一个空数组
    }
    this.events[event].push(callback); // 将回调函数添加到订阅者的数组
  }

  // 取消订阅事件
  unsubscribe(event, callback) {
    if (!this.events[event]) {
      return;
    }
    this.events[event] = this.events[event].filter(cb => cb !== callback); // 移除指定的回调函数
  }

  // 取消特定事件的所有订阅
  unsubscribeAll(event) {
    if (this.events[event]) {
      delete this.events[event]; // 删除所有订阅者
    }
  }

  // 触发事件,使用 emit 作为方法名
  emit(event, data) {
    if (this.events[event]) {
      // 执行所有订阅者的回调函数
      this.events[event].forEach(callback => callback(data));
    }
  }

  // 检查是否有订阅者
  hasSubscribers(event) {
    return this.events[event] && this.events[event].length > 0;
  }
}

// 使用示例
const eventCenter = new PubSub();

// 订阅 'message' 事件
eventCenter.subscribe('message', (data) => {
  console.log(`Message received: ${data}`);
});

// 订阅 'greet' 事件
eventCenter.subscribe('greet', (name) => {
  console.log(`Hello, ${name}!`);
});

// 触发 'message' 事件
eventCenter.emit('message', 'Hello, Pub/Sub!');

// 触发 'greet' 事件
eventCenter.emit('greet', 'World');

// 取消对 'message' 事件的订阅
const myCallback = (data) => {
  console.log(`My callback received: ${data}`);
};
eventCenter.subscribe('message', myCallback);
eventCenter.unsubscribe('message', myCallback);

// 再次触发 'message' 事件,myCallback 不会被调用
eventCenter.emit('message', 'This message will not be received by myCallback');
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70

Σε αυτό το παράδειγμα,PubSub Η κλάση παρέχει τις ακόλουθες λειτουργίες:

  • subscribe Η μέθοδος επιτρέπει στους συνδρομητές να καταχωρούν μια λειτουργία επανάκλησης σε ένα συγκεκριμένο συμβάν.
  • unsubscribe Η μέθοδος επιτρέπει στους συνδρομητές να καταργήσουν την εγγραφή των λειτουργιών επανάκλησης από συγκεκριμένα συμβάντα.
  • unsubscribeAll Η μέθοδος ακυρώνει όλες τις συνδρομές σε ένα συγκεκριμένο συμβάν.
  • emit Η μέθοδος ενεργοποιεί το συμβάν και εκτελεί τις λειτουργίες επανάκλησης όλων των συνδρομητών.
  • hasSubscribers Η μέθοδος ελέγχει εάν υπάρχουν συνδρομητές για ένα συγκεκριμένο συμβάν.