τα στοιχεία επικοινωνίας μου
Ταχυδρομείο[email protected]
2024-07-12
한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina
Τα μοτίβα σχεδίασης είναι γενικές λύσεις σε κοινά προβλήματα στο σχεδιασμό λογισμικού. Τα παρακάτω είναι μερικά κοινά σχέδια σχεδίασης, χωρισμένα σε τρεις μεγάλες κατηγορίες: μοτίβα δημιουργίας, δομικά μοτίβα και μοτίβα συμπεριφοράς.
Αυτά τα μοτίβα παρέχουν μηχανισμούς για τη δημιουργία αντικειμένων, αυξάνοντας την ευελιξία και την επαναχρησιμοποίηση του υπάρχοντος κώδικα.
Μονόχρωμο μοτίβο:
Μοτίβο μεθόδου εργοστασίου:
Abstract Factory Pattern (Abstract Factory):
Μοτίβο δόμησης (Δόμηση):
Πρωτότυπο:
Αυτά τα μοτίβα ασχολούνται με συνδυασμούς αντικειμένων ή σχέσεις μεταξύ αντικειμένων και αυτών.
Λειτουργία προσαρμογέα:
Μοτίβο διακοσμητή (Διακοσμητής):
Λειτουργία διακομιστή μεσολάβησης (Proxy):
Πρόσοψη:
Λειτουργία γέφυρας (Bridge):
Σύνθετη λειτουργία:
Λειτουργία flyweight:
Αυτά τα μοτίβα επικεντρώνονται στην επικοινωνία μεταξύ των αντικειμένων, δηλαδή στο πώς τα αντικείμενα αλληλεπιδρούν και κατανέμουν τις ευθύνες.
Στρατηγική:
Μοτίβο μεθόδου προτύπου (Μέθοδος προτύπου):
Μοτίβο παρατηρητή (Παρατηρητής):
Μοτίβο Iterator (Iterator):
Μοντέλο Αλυσίδας Ευθύνης:
Λειτουργία εντολών (Command):
Λειτουργία Memento:
Λειτουργία κατάστασης:
Λειτουργία επισκέπτη:
Μοτίβο διαμεσολαβητή:
Λειτουργία διερμηνέα (Διερμηνέας):
Κατά τη διάρκεια της τελευταίας συνέντευξης, με ρώτησαν σχετικά με τη χρήση κώδικα για την υλοποίηση του μοτίβου συνδρομητή-εκδότη, είχα χρόνο να προσομοιώσω αυτά τα μοτίβα σχεδίασης με κώδικα 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');
Σε αυτό το παράδειγμα,PubSub
Η κλάση παρέχει τις ακόλουθες λειτουργίες:
subscribe
Η μέθοδος επιτρέπει στους συνδρομητές να καταχωρούν μια λειτουργία επανάκλησης σε ένα συγκεκριμένο συμβάν.unsubscribe
Η μέθοδος επιτρέπει στους συνδρομητές να καταργήσουν την εγγραφή των λειτουργιών επανάκλησης από συγκεκριμένα συμβάντα.unsubscribeAll
Η μέθοδος ακυρώνει όλες τις συνδρομές σε ένα συγκεκριμένο συμβάν.emit
Η μέθοδος ενεργοποιεί το συμβάν και εκτελεί τις λειτουργίες επανάκλησης όλων των συνδρομητών.hasSubscribers
Η μέθοδος ελέγχει εάν υπάρχουν συνδρομητές για ένα συγκεκριμένο συμβάν.