2017-01-14 2 views

Répondre

0

Ce sont des sortes de solutions similaires.
De toute façon, ils sont généralement destinés à résoudre des problèmes légèrement différents.

Tenir compte de la classe suivante:

template<PolicyDoX PX, PolicyDoY> 
struct PolicyBased { 
    void doSomething() { 
     // ... A few operations 
     PX::doX(); 
     // ... Some other operations 
     PX::doY(); 
    } 
}; 

Voici une approche fondée sur la politique triviale. Le concept clé est que la classe s'attend à ce que les politiques aient donné (laissez-moi dire) interfaces. C'est une question de mise en œuvre (comment ils vont le faire), pas de ce qui est réellement offert.
En d'autres termes, les utilisateurs de la classe ne sont pas affectés par les politiques données en termes de fonctionnalités, car PolicyBased offrent la même interface dans tous les cas.

De l'autre côté, considérez ceci:

struct X { int i; void f() {} } 
struct Y { char c; void g() {} }; 
struct Z { void h() {} }; 

template<typename... T> 
struct Mixin: T... {} 

using Full = Mixin<X, Y, Z>; 
using Partial = Mixin<X, Z>; 

Dans ce cas, le mixin change son interface lorsque vous utilisez un ensemble de composants différents. La classe elle-même n'attend aucun ensemble de fonctionnalités et les offre simplement aux utilisateurs finaux.
Par conséquent, le mixin peut être considéré comme un compartiment dans lequel vous pouvez mettre presque tous les composants pour obtenir votre type préféré et ce type aura une interface strictement dépendante des composants choisis.

Pour résumer:

  • politiques définissent comment faire quelque chose, mais ne modifie pas l'interface de la classe qui les accepte.

  • Les mixins acceptent de créer un nouveau type avec sa propre interface donnée par l'ensemble des composants utilisés pour définir le mixage.

+0

Je ne vois toujours pas comment dans l'exemple 'Mixin' vous avez donné en quoi il diffère de la conception orientée sur les politiques. X, Y et Z semblent être des polices du composite appelé 'Mixin' –

+0

@JuliaSterbs La classe mixin ne s'attend pas à ce que ses types spécifiques aient une interface particulière. La conception basée sur la politique délègue aux fonctionnalités spécifiques à la politique, donc ces types doivent offrir des interfaces fixes. – skypjack