Tout en lisant sur le modèle de la classe adaptateur dans Head Premier modèle de conception , je suis venu à travers cette phrase:
adaptateur de classe ... Parce que vous avez besoin de multiples héritage pour la mettre en œuvre, ce qui n'est pas possible dans Java P> blockQuote>
Juste pour expérimenter, j'ai essayé ce qui suit: p>
xxx pré> suppose que je crée: p>
xxx pré> Dans mon code, je peux utiliser: p>
xxx pré> n'est pas le motif de l'adaptateur de classe? P> p>
5 Réponses :
Le motif de l'adaptateur de classe n'est pas possible dans Java car vous ne pouvez pas étendre plusieurs classes. Donc, vous devrez aller avec le motif de l'adaptateur qui utilise la composition plutôt que dans l'héritage.
Un exemple du motif de l'adaptateur via la composition peut être trouvé ci-dessous: p>
class DuckCatcher { public void catch(Duck duck) { } }
Ceci est le motif de l'adaptateur d'objet. L'OP veut essayer de mettre en œuvre le motif de l'adaptateur de classe.
@Vineet: Pourriez-vous augmenter? Je ne suis pas sûr de la différence entre les deux? Je pensais qu'il n'y avait qu'un seul "modèle d'adaptateur" général.
Le cahier des premiers modèles de tête, décrit la variante où l'héritage (et non la composition) est utilisé pour implémenter l'adaptateur de classe. Ceci est possible en C ++ - voir Cet exemple par exemple.
@Vineet: Ah je vois, merci pour le lien. Le motif de l'adaptateur par héritage serait impossible en Java.
n'acceptez pas que l'adaptateur de classe n'est pas possible; Découvrez ce lien en.wikipedia.org/wiki/adapter_pattern
Je suis avec @ rai.skumar sur celui-ci ... Il est très évident que vous utilisiez des interfaces au lieu de sous-classement. Pour citer Wiki directement: "Ce type d'adaptateur utilise plusieurs interfaces polymorphes pour atteindre son objectif. L'adaptateur est créé en implémentant ou en héritant à la fois l'interface attendue et l'interface préexistante. Il est typique de l'interface attendue. être créé comme une classe d'interface pure, en particulier dans des langues telles que Java qui ne prennent pas en charge plusieurs héritages. "
C'est une histoire différente si vous ne choisissez pas ces interfaces à l'avance, je suppose.
+1 pour faire une dinde agir comme un canard; clair, concis et comique.
L'histoire complète dans les têtes est la suivante: Classe Strong> Adaptateur est Impossible em> en Java, juste parce que Java ne fournit pas héritage multiple em>. p>
Dans leur diagramme, ils montrent que l'adaptateur code> Classe EM> Sous-classes em> cible code> et
Adaptee code>. Votre exemple est (proche de) le motif de l'adaptateur d'objet. La différence est que vous implémentez la cible em> dans votre classe d'adaptateur, plutôt que sous-classant simplement la cible (
myneededinterface code> dans votre exemple) p>
Pourtant, cela atteint le même objectif (adapter l'Adaptee) et n'est clairement pas le modèle d'adaptateur d'objet. Si vous ne pouvez pas appeler le motif de l'adaptateur de classe, que l'appelez-vous?
Oui, vous pouvez créer un adaptateur de classe avec une interface tant que vous n'envoyez qu'une seule adapte. Avec plusieurs héritage, vous pouvez prendre deux personnes ou plus d'adapte et les envelopper dans une seule interface. P>
Les adaptateurs de classe sont un peu possibles dans Java en utilisant un seul héritage. Comme exemple de Modèle de conception pour les mannequins , supposons que nous devions adapter les cases à cocher AWT Pour être utilisé à côté de cases à cocher, nous pouvons écrire un adaptateur de classe pour cela.
Le code de l'interface utilisateur dans Swing Pour déterminer si une case à cocher est cochée est effectuée avec la méthode issuite. Mais, les cases à cocher AWT ne supportent pas isselected (), elles utilisent getState () à la place. P>
afin que nous puissions écrire un adaptateur pour envelopper une case à cocher SWT et adapter le getState () à destination () à destination () P >
public void itemStateChanged(ItemEvent e) { String outString = new String("Selected: "); for(int loopIndex = 0; loopIndex <= checks.length - 1; loopIndex++){ if(checks[loopIndex].isSelected()) { outString += " checkbox " + loopIndex; } } text.setText(outString); }
GOF (Gang of Four) nous indique que deux principaux types d'adaptateurs:
a. Adaptateurs de classe. Ils utilisent généralement plusieurs héritages pour adapter une interface à une autre. (Mais nous devons nous rappeler, en Java, une héritage multiple à travers des classes n'est pas prise en charge (pour une bonne raison :)). Nous avons besoin d'interfaces pour mettre en œuvre le concept d'héritage multiple.) P>
b. Adaptateurs d'objets. Ils dépendent des compositions d'objet. P>
Pour illustrer les concepts, je présenterai un exemple simple: (Source: Réservez des motifs de conception Java) P>
interface IIntegerValue { public int getInteger(); } class IntegerValue implements IIntegerValue { @Override public int getInteger() { return 5; } } // Adapter using interface class ClassAdapter extends IntegerValue { //Incrementing by 2 public int getInteger() { return 2 + super.getInteger(); } } // Adapter using composition class ObjectAdapter implements IIntegerValue { private IIntegerValue myInt; public ObjectAdapter(IIntegerValue myInt) { this.myInt=myInt; } //Incrementing by 2 public int getInteger() { return 2+this.myInt.getInteger(); } } class ClassAndObjectAdapter { public static void main(String args[]) { System.out.println("Class and Object Adapter Demo"); ClassAdapter ca1=new ClassAdapter(); System.out.println("Class Adapter is returning :"+ca1.getInteger()); ClassAdapter ca2=new ClassAdapter(); ObjectAdapter oa=new ObjectAdapter(new IntegerValue()); System.out.println("Object Adapter is returning :"+oa.getInteger()); } }