web-dev-qa-db-fra.com

Qu'est-ce que l'abstraction signifie dans le modèle de conception de pont?

Le modèle de pont est défini comme "le modèle de pont découle une abstraction de sa mise en œuvre, de sorte que les deux puissent varier de manière indépendante". Je reçois cette abstraction ici ne signifie pas la classe/interface abstraite, mais ce n'est pas clair sur quelle abstraction signifie réellement. Mais certaines sources en ligne impliquent cela.

https://sourcemakaking.com/design_patterns/bridge le décrit comme suit:

"Le durcissement des artères logicielles" a eu lieu en utilisant le sous-classement d'une classe de base abstraite pour fournir des implémentations alternatives. Cela verrouille la liaison de la compilation entre l'interface et la mise en œuvre. L'abstraction et la mise en œuvre ne peuvent pas être étendues indépendamment ou composées.

Il semble suggérer qu'une classe/interface abstraite doit être découplée de ses implémentations, ce qui semble impair. Comment voudriez-vous fournir des implémentations alternatives? Ma compréhension du modèle de pont est que c'est un moyen d'organiser certaines fonctionnalités qui varient en plusieurs dimensions indépendantes, dans plusieurs hiérarchies pour chaque dimension, au lieu d'avoir un nombre exponentiel de variantes. Il semble également une conséquence des deux principes: (i) le code contre une interface plutôt que des implémentations concrètes et (ii) encapsulent ce qui varie.

Quelqu'un peut-il expliquer quelle est la définition du modèle de pont comme décrit dans le livre de gof? Est-ce que je manque quelque chose ici ou est-ce juste une description mal formulée?

2
takasugi

Selon - GOF , le modèle de pont a l'intention suivante:

Découpler une abstraction de sa mise en œuvre pour que les deux puissent varier de manière indépendante .

En effet, vous avez raison, ce n'est pas à propos de abstraction Dans le sens de OOP techniques telles que des classes abstraits. Il s'agit d'un abstraction Dans la conception , c'est-à-dire une généralisation plus large ou un concept de niveau supérieur sans détails inutiles. Et il utilise composition sur héritage pour la mise en œuvre.

C'est un modèle relativement complexe, qui n'est pas tellement utilisé. Regardons l'exemple GOF dans le domaine de l'interface graphique, car il est simple:

  • Nous pouvons imaginer le concept de Window dans une interface graphique avec deux méthodes, drawText() et drawRectangle().
  • Maintenant, imaginez une implémentation de fenêtre WindowImp, avec deux méthodes, drawText() et drawLine().
  • Chaque Window est associé à un WindowImp (exécution - composition d'objet , comme avec la stratégie, vous pouvez choisir à l'exécution la mise en œuvre la plus appropriée). Il transfère simplement drawText() à la mise en œuvre, mais convertit un appel à un plus abstrait drawRectangle() en quatre drawLine().

Nous venons de découpler une abstraction de sa mise en œuvre. Fait intéressant, nous avons une abstraction de conception mappée sur un béton OOP, et nous avons une implémentation de conception mappée sur un résumé OOP CLASE. Cela fait cela motif déroutant et difficile à comprendre.

Tout cela apparaît inutilement complexe. Mais maintenant, essayons de laisser les deux évoluer de manière indépendante:

  • Le WindowImp peut être spécialisé dans un MSWindowsImp, un OSXWindowsImp et un ConsoleWindowsImp (j'ai un exemple de gofe un peu gof). Donc, ici, la mise en œuvre peut évoluer en fonction de la plate-forme technologique, qui fournit les méthodes concrètes qui appellent les fonctions du système d'exploitation correspondantes.
  • Mais l'abstraction peut être spécialisée à l'aide d'un angle complètement différent, par exemple dans WarningWindow et un ImageWindow. Ces spécialisations peuvent ajouter des opérations supplémentaires basées sur l'opération de l'abstraction.

L'avantage est la séparation des préoccupations et des exigences de maintenance. Dans cet exemple, vous avez dans les 3 Abstractions et 4 classes de mise en œuvre, avec un ensemble de tâches clairement délivré (par exemple, des besoins en matière d'application VS OS). Sans le pont, vous auriez soit une explosion combinatoire avec au moins 9 classes et chaque classe devrait s'occuper des préoccupations de l'application et du système d'exploitation, de sorte que vous risquiez d'avoir une maintenance redondante (par exemple, un changement de l'API OS serait conduire à 3 classes étant mis à jour sans le pont au lieu d'un seul avec le pont).

1
Christophe