Partage de technologie

Résumé des modèles de conception de logiciels

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.

Modèles de création

Ces modèles fournissent des mécanismes de création d'objets, augmentant la flexibilité et la réutilisabilité du code existant.

  1. Modèle singleton

    • Assurez-vous qu’il n’existe qu’une seule instance d’une classe et fournissez un point d’accès global.
  2. Modèle de méthode d'usine

    • Définissez l'interface de création d'objets et laissez les sous-classes décider quelle classe instancier.
  3. Modèle d'usine abstraite (usine abstraite)

    • Créez des familles d'objets liés ou dépendants sans spécifier explicitement de classes concrètes.
  4. Modèle de constructeur (Builder)

    • Construisez un objet complexe et permettez une construction étape par étape.
  5. Prototype

    • Créez une nouvelle instance en copiant une instance existante, plutôt qu'en en créant une nouvelle.

Modèles structurels

Ces modèles traitent des combinaisons d'objets ou des relations entre les objets et eux.

  1. Mode adaptateur

    • Permet de résoudre les incompatibilités d'interface entre objets grâce à un "adaptateur".
  2. Patron Décorateur (Décorateur)

    • Ajoutez dynamiquement des responsabilités supplémentaires à un objet.
  3. Mode proxy (proxy)

    • Fournit un remplaçant ou un espace réservé pour un autre objet afin d’en contrôler l’accès.
  4. Façade

    • Fournit une interface de haut niveau unifiée pour accéder à un groupe d'interfaces dans le sous-système.
  5. Mode pont (Pont)

    • Séparez la partie abstraite de son implémentation afin qu'elles puissent varier indépendamment.
  6. Mode composite

    • Regroupez les objets dans une structure arborescente pour représenter une hiérarchie partie-tout.
  7. Mode poids mouche

    • Prenez en charge efficacement un grand nombre d’objets à granularité fine grâce au partage.

Modèles comportementaux

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.

  1. Stratégie

    • Définissez une série d'algorithmes, encapsulez-les un par un et rendez-les interchangeables.
  2. Modèle de méthode modèle (méthode modèle)

    • Définir le cadre de l'algorithme dans la méthode et reporter l'implémentation aux sous-classes.
  3. Modèle d'observateur (Observateur)

    • Relation de dépendance un-à-plusieurs entre les objets Lorsqu'un objet change d'état, tous les objets qui en dépendent seront notifiés et automatiquement mis à jour.
  4. Modèle d'itérateur (Itérateur)

    • Accédez séquentiellement aux éléments individuels d’un objet agrégé sans exposer sa représentation interne.
  5. Modèle de chaîne de responsabilité

    • Donnez à plusieurs objets une chance de gérer la demande, évitant ainsi le couplage entre l'expéditeur et le destinataire de la demande.
  6. Mode commande (Commande)

    • Encapsule la requête en tant qu'objet, permettant à l'utilisateur de paramétrer le client avec différentes requêtes.
  7. Mode souvenir

    • Capturez l'état interne d'un objet et enregistrez cet état en dehors de l'objet sans rompre l'encapsulation.
  8. Mode État

    • Permet à un objet de modifier son comportement lorsque son état interne change.
  9. Mode visiteur

    • Ajoutez de nouvelles fonctionnalités à une structure d'objet (telle qu'une structure composite).
  10. Modèle de médiateur

    • Définissez un objet intermédiaire pour simplifier l’interaction entre les objets originaux.
  11. Mode interprète (Interprète)

    • Définir une représentation grammaticale d'une langue et interpréter les phrases définies dans cette langue.

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');
  • 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

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.