2024-07-12
한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina
Entwurfsmuster sind allgemeine Lösungen für häufige Probleme beim Softwaredesign. Im Folgenden sind einige gängige Entwurfsmuster aufgeführt, die in drei Hauptkategorien unterteilt sind: Gestaltungsmuster, Strukturmuster und Verhaltensmuster.
Diese Muster stellen Mechanismen für die Objekterstellung bereit und erhöhen so die Flexibilität und Wiederverwendbarkeit von vorhandenem Code.
Singleton-Muster:
Factory-Methodenmuster:
Abstraktes Fabrikmuster (Abstrakte Fabrik):
Builder-Muster (Builder):
Prototyp:
Diese Muster befassen sich mit Kombinationen von Objekten oder Beziehungen zwischen Objekten und ihnen.
Adaptermodus:
Dekorationsmuster (Dekorateur):
Proxy-Modus (Proxy):
Fassade:
Bridge-Modus (Bridge):
Composite-Modus:
Fliegengewichtsmodus:
Diese Muster konzentrieren sich auf die Kommunikation zwischen Objekten, also darauf, wie Objekte miteinander interagieren und wie sie Verantwortlichkeiten verteilen.
Strategie:
Vorlagenmethodenmuster (Vorlagenmethode):
Beobachtermuster (Beobachter):
Iteratormuster (Iterator):
Modell der Verantwortungskette:
Befehlsmodus (Befehl):
Erinnerungsmodus:
Zustandsmodus:
Besuchermodus:
Mediatormuster:
Dolmetschermodus (Interpreter):
Während des letzten Interviews wurde ich nach der Verwendung von Code zur Implementierung des Abonnenten-Herausgeber-Musters gefragt. Ich hatte Zeit, diese Entwurfsmuster mit js-Code zu simulieren.
Zum Beispiel
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');
In diesem Beispiel,PubSub
Die Klasse bietet die folgende Funktionalität:
subscribe
Mit dieser Methode können Abonnenten eine Rückruffunktion für ein bestimmtes Ereignis registrieren.unsubscribe
Mit dieser Methode können Abonnenten ihre Rückruffunktionen von bestimmten Ereignissen abmelden.unsubscribeAll
Die Methode kündigt alle Abonnements für ein bestimmtes Ereignis.emit
Die Methode löst das Ereignis aus und führt die Callback-Funktionen aller Teilnehmer aus.hasSubscribers
Methode prüft, ob Abonnenten für ein bestimmtes Ereignis vorhanden sind.