Twin vzor - Twin pattern
![]() | tento článek příliš spoléhá na Reference na primární zdroje.Duben 2020) (Zjistěte, jak a kdy odstranit tuto zprávu šablony) ( |
v softwarové inženýrství, Twin vzor je vzor návrhu softwaru který umožňuje vývojářům modelovat vícenásobné dědictví v programovacích jazycích, které nepodporují vícenásobné dědění. Tento vzor se vyhne mnoha problémům s vícenásobným dědičností.[1]
Definice
Místo toho, abyste měli jedinou třídu, která je odvozena ze dvou nadtříd, mějte dvě samostatné podtřídy, z nichž každá je odvozena z jedné ze dvou nadtříd. Tyto dvě podtřídy jsou úzce spjaty, takže na obě lze pohlížet jako na dvojitý objekt se dvěma konci.[1]
Použitelnost
Lze použít dvojitý vzor:
- modelovat vícenásobné dědictví v jazyce, ve kterém vícenásobné dědictví není podporováno
- vyhnout se problémům s vícenásobným dědičností.[1]
Struktura
Budou existovat dvě nebo více nadřazených tříd, které se obvykle dědí. Budou existovat podtřídy, z nichž každá bude odvozena od jedné ze superkultur. Podtřídy jsou vzájemně propojeny prostřednictvím polí a každá podtřída může přepsat metody zděděné od nadtřídy. Nové metody a pole jsou obvykle deklarovány v jedné podtřídě.[1]
Následující diagram ukazuje typickou strukturu vícenásobné dědičnosti:

Následující diagram ukazuje strukturu Twin pattern po nahrazení předchozí struktury vícenásobných dědičností:

Spolupráce
Každá podřízená třída je zodpovědná za protokol zděděný od svého rodiče. Zpracovává zprávy z tohoto protokolu a předává další zprávy své partnerské třídě.[1]
Klienti dvojitého vzoru odkazují na jeden z dvojitých objektů přímo a na druhý prostřednictvím svého dvojitého pole.[1]
Klienti, kteří se spoléhají na protokoly nadřazených tříd, komunikují s objekty příslušné podřízené třídy.[1]
Ukázkový kód
Následující kód je načrtnutá implementace desky počítačové hry s pohybujícími se míčky.
třída pro herní plán:
veřejnost třída Hrací deska rozšiřuje Plátno { veřejnost int šířka, výška; veřejnost GameItem firstItem; …}
skica kódu pro třídu GameItem:
veřejnost abstraktní třída GameItem { Hrací deska prkno; int posX, kytice; GameItem další; veřejnost abstraktní prázdnota kreslit(); veřejnost abstraktní prázdnota klikněte (MouseEvent E); veřejnost abstraktní booleovský protíná se (GameItem jiný); veřejnost abstraktní prázdnota srazit se (GameItem jiný); veřejnost prázdnota šek() { GameItem X; pro (X = prkno.firstItem; X != nula; X = X.další) -li (protíná se(X)) srazit se(X); } veřejnost statický BallItem novýBall(int posX, int kytice, int poloměr) {// metoda GameBoard BallItem ballItem = Nový BallItem(posX, kytice, poloměr); BallThread ballThread = Nový BallThread(); ballItem.dvojče = ballThread; ballThread.dvojče = ballItem; vrátit se ballItem; }}
skica kódu pro třídu BallItem:
veřejnost třída BallItem rozšiřuje GameItem { BallThread dvojče; int poloměr; int dx, dy; booleovský pozastaveno; veřejnost prázdnota kreslit() { prkno.getGraphics().drawOval(posX-poloměr, kytice-poloměr, 2*poloměr, 2*poloměr); } veřejnost prázdnota hýbat se() { posX += dx; kytice += dy; } veřejnost prázdnota klikněte() { -li (pozastaveno) dvojče.životopis(); jiný dvojče.pozastavit(); pozastaveno = ! pozastaveno; } veřejnost booleovský protíná se (GameItem jiný) { -li (jiný instanceof stěna) vrátit se posX - poloměr <= jiný.posX && jiný.posX <= posX + poloměr || kytice - poloměr <= jiný.kytice && jiný.kytice <= kytice + poloměr; jiný vrátit se Nepravdivé; } veřejnost prázdnota srazit se (GameItem jiný) { stěna stěna = (stěna) jiný; -li (stěna.jeVertikální) dx = - dx; jiný dy = - dy; }}
Náčrt kódu pro třídu BallThread:
veřejnost třída BallThread rozšiřuje Vlákno { BallItem dvojče; veřejnost prázdnota běh() { zatímco (skutečný) { dvojče.kreslit(); /*vymazat*/ dvojče.hýbat se(); dvojče.kreslit(); } }}
Implementace dvojitého vzoru
Je třeba vzít v úvahu následující problémy:
- Abstrakce dat - partnerské třídy třídy twin musí být pevně spojeny, protože pravděpodobně musí navzájem přistupovat k soukromým polím a metodám. V Javě toho lze dosáhnout umístěním partnerských tříd do společného balíčku a zajištěním viditelnosti balíku pro požadovaná pole a metody. V Modula-3 a Oberon mohou být partnerské třídy umístěny do společného modulu
- Efektivita - Jelikož model dvojčat používá složení, které vyžaduje předávání zpráv, může být vzor dvojčat méně účinný než dědičnost. Jelikož je však vícenásobné dědictví o něco méně efektivní než jedno dědictví, režie nebude velkým problémem.[1][2]
Viz také
- Vzor adaptéru, speciálně obousměrný adaptér