2024-07-12
한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina
Les modèles de conception sont des solutions générales à des problèmes courants dans la conception de logiciels. Voici quelques modèles de conception courants, divisés en trois grandes catégories : les modèles de création, les modèles structurels et les modèles de comportement.
Ces modèles fournissent des mécanismes de création d'objets, augmentant la flexibilité et la réutilisabilité du code existant.
Modèle singleton:
Modèle de méthode d'usine:
Modèle d'usine abstraite (usine abstraite):
Modèle de constructeur (Builder):
Prototype:
Ces modèles traitent des combinaisons d'objets ou des relations entre les objets et eux.
Mode adaptateur:
Patron Décorateur (Décorateur):
Mode proxy (proxy):
Façade:
Mode pont (Pont):
Mode composite:
Mode poids mouche:
Ces modèles se concentrent sur la communication entre les objets, c'est-à-dire sur la manière dont les objets interagissent et répartissent les responsabilités.
Stratégie:
Modèle de méthode modèle (méthode modèle):
Modèle d'observateur (Observateur):
Modèle d'itérateur (Itérateur):
Modèle de chaîne de responsabilité:
Mode commande (Commande):
Mode souvenir:
Mode État:
Mode visiteur:
Modèle de médiateur:
Mode interprète (Interprète):
Lors de la dernière interview, on m'a demandé comment utiliser du code pour implémenter le modèle abonné-éditeur. J'ai eu le temps de simuler ces modèles de conception avec du code js.
Par exemple
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');
Dans cet exemple,PubSub
La classe fournit les fonctionnalités suivantes :
subscribe
La méthode permet aux abonnés d'enregistrer une fonction de rappel pour un événement spécifique.unsubscribe
La méthode permet aux abonnés de désenregistrer leurs fonctions de rappel d'événements spécifiques.unsubscribeAll
La méthode annule tous les abonnements à un événement spécifique.emit
La méthode déclenche l'événement et exécute les fonctions de rappel de tous les abonnés.hasSubscribers
La méthode vérifie s'il y a des abonnés pour un événement spécifique.