„Illesztő programtervezési minta” változatai közötti eltérés

[ellenőrzött változat][ellenőrzött változat]
Tartalom törölve Tartalom hozzáadva
a 1 link egyértelműsítés
B.Zsoltbot (vitalap | szerkesztései)
a replaced: <source → <syntaxhighlight (13), </source> → </syntaxhighlight> (13) AWB
48. sor:
Erre egy fordítási idejű megoldás a következő:
 
<sourcesyntaxhighlight lang="Java">
classB.setStringData(classA.getStringData());
</syntaxhighlight>
</source>
 
Habár feltételezzük, hogy a string formátumú adat megváltoztatható.
Egy fordítási idejű megoldás az öröklődés használatára:
 
<sourcesyntaxhighlight lang="Java">
Format1ClassA extends ClassA {
public String getStringData() {
61. sor:
}
}
</syntaxhighlight>
</source>
 
és esetleg elkészíti a korrekt formátumú objektumot futásidőben a [[Gyár programtervezési minta]] segítségével.
69. sor:
(i) Definiáljunk egy köztes "szolgáltató" interfészt, és írjunk meg a szolgáltató implementációját, amely becsomagolja az adat forrást. Pl. ebben a példában <code>ClassA</code>, amely kiírja az adatokat a megfelelő formátumban:
 
<sourcesyntaxhighlight lang="Java">
public interface StringProvider {
public String getStringData();
85. sor:
}
}
</syntaxhighlight>
</source>
 
(ii) Írjunk egy illesztő osztályt, amely visszatér a szolgáltató egy speciális megvalósításával:
 
<sourcesyntaxhighlight lang="Java">
public class ClassAFormat1Adapter extends Adapter {
public Object adapt(final Object OBJECT) {
95. sor:
}
}
</syntaxhighlight>
</source>
 
(iii) Regisztráljuk az <code>Adapter</code>-t a globális registry-ben, hogy az <code>Adapter</code> lookup-olni tudjon futásidőben:
 
<sourcesyntaxhighlight lang="Java">
AdapterFactory.getInstance().registerAdapter(ClassA.class, ClassAFormat1Adapter.class, "format1");
</syntaxhighlight>
</source>
 
(iv) Abban az esetben, ha adatot szeretnénk küldeni a <code>ClassA</code>-ból a <code>ClassB</code>-ba, írjuk a következőt:
 
<sourcesyntaxhighlight lang="Java">
Adapter adapter = AdapterFactory.getInstance().getAdapterFromTo(ClassA.class,
StringProvider.class, "format1");
111. sor:
String string = provider.getStringData();
classB.setStringData(string);
</syntaxhighlight>
</source>
 
vagy rövidebben:
 
<sourcesyntaxhighlight lang="Java">
classB.setStringData(((StringProvider) AdapterFactory.getInstance().getAdapterFromTo(ClassA.class,
StringProvider.class, "format1").adapt(classA)).getStringData());
</syntaxhighlight>
</source>
 
(v) Akkor előnyösebb, ha az adatátvitelhez a 2. formátum az elvárt: meg kell keresni hozzá a különböző illesztőt/szolgáltatót:
 
<sourcesyntaxhighlight lang="Java">
Adapter adapter = AdapterFactory.getInstance().getAdapterFromTo(ClassA.class,
StringProvider.class, "format2");
</syntaxhighlight>
</source>
 
(vi) Ha az elvárt viselkedés az, hogy a kimenet megkapható legyen a <code>ClassA</code>-ból, pl. képi adatként <code>ClassC</code> formájába:
<sourcesyntaxhighlight lang="Java">
Adapter adapter = AdapterFactory.getInstance().getAdapterFromTo(ClassA.class, ImageProvider.class,
"format1");
ImageProvider provider = (ImageProvider) adapter.adapt(classA);
classC.setImage(provider.getImage());
</syntaxhighlight>
</source>
 
(vii) Ezzel a módszerrel az illesztők és szolgáltatók használata biztosítja a <code>ClassB</code>-n és <code>ClassC</code>-n keresztül a többszörös "nézeteket" a <code>ClassA</code>-on az osztály hierarchia módosítása nélkül. Általánosan szólva így egy mechanizmus engedélyezhető önkényes adatfolyamokra az objektumok között, ami így utólagosan alkalmazható egy létező objektum hierarchiára.
140. sor:
Az illesztő minta megvalósításakor az egyértelműség kedvéért használjuk az <code>[AdapteeClassName]To[Interface]Adapter</code> osztály neveket, pl. <code>DAOToProviderAdapter</code>. Kell egy konstruktor metódus, aminek az illesztendő osztály változó paramétere. Ezt a paramétert fogja tovább adni a <code>AdapteeClassName]To[Interface]Adapter</code> példány változónak.
 
<sourcesyntaxhighlight lang="Java">
public class AdapteeToClientAdapter implements Client {
 
155. sor:
 
}
</syntaxhighlight>
</source>
===Java===
<sourcesyntaxhighlight lang=Java>
public class AdapteeToClientAdapter implements Adapter {
 
172. sor:
 
}
</syntaxhighlight>
</source>
 
===Az illesztő minta C# megvalósítása===
A következő példa az illesztő minta egy C# megvalósítást mutatja be.<ref>Thank you to devshed for providing the original version of this code under open license</ref> Ebben a példában <code>IEmployee</code> objektumok gyűjteményét (collection) készítjük el. Habár az employee (alkalmazott) megvalósítja az <code>IEmployee</code>-t, így természetesen hozzáadható a listához, de a <code>Consultant</code> (tanácsadó) osztály nem kötődik az <code>IEmployee</code>-hoz. Azért, hogy ez az osztály hozzáadható legyen ugyanahhoz a listához, el kell készíteni egy <code>EmployeeAdapter</code> nevű illesztő osztályt, amely becsomagolja a <code>Consultant</code> osztályt. Ez használja az <code>IEmployee</code> interfészt, ezáltal lehetővé téve, hogy hozzáadható legyen ugyanahhoz a listához.
 
<sourcesyntaxhighlight lang="csharp">
using System.Collections.Generic;
 
247. sor:
}
}
</syntaxhighlight>
</source>
===Scala===
<sourcesyntaxhighlight lang=Scala>
implicit def adaptee2Adapter(adaptee: Adaptee): Adapter = {
new Adapter {
257. sor:
}
}
</syntaxhighlight>
</source>
 
==Kapcsolódó szócikkek==