A tervezési minta vagy minta ( angol tervezési minta ) a szoftverfejlesztésben egy megismételhető építészeti terv , amely megoldást jelent egy tervezési problémára bizonyos gyakran előforduló kontextusban .
Általában egy sablon nem teljes példa, amely közvetlenül kóddá alakítható ; ez csak egy példa egy problémamegoldásra, amely különféle helyzetekben használható. Az objektumorientált minták az osztályok vagy objektumok közötti kapcsolatokat és interakciókat mutatják meg anélkül, hogy meghatároznák, mely végső osztályokat vagy alkalmazásobjektumokat használják fel.
Az "alacsony szintű" mintákat, amelyek figyelembe veszik egy adott programozási nyelv sajátosságait, idiómáknak nevezzük . Ezek jó tervezési döntések, amelyek egy adott nyelvre vagy szoftverplatformra jellemzőek, ezért nem univerzálisak.
A legmagasabb szinten olyan építészeti minták vannak , amelyek lefedik a teljes szoftverrendszer architektúráját .
Az algoritmusok eleve szintén minták, de nem tervezési minták, hanem számítások , mivel számítási problémákat oldanak meg.
Az 1970 - es években Christopher Alexander építész tervmintákat állított össze. Az építészet területén ez az elképzelés nem fejlődött ki annyira, mint később a szoftverfejlesztés területén.
1987 -ben Kent Beck és Ward Cunningham átvették Alexander ötleteit, és sablonokat fejlesztettek ki a smalltalk grafikus felhasználói felületet fejlesztő szoftverekhez .
1988- ban Erich Gamma doktori disszertációját kezdte írni a Zürichi Egyetemen ennek a technikának a szoftverfejlesztésben való általános hordozhatóságáról.
1989 és 1991 között James Coplien a C++ programozási kifejezések fejlesztésén dolgozott, és 1991-ben kiadta az Advanced C++ Idioms című kiadványt.
Ugyanebben az évben Erich Gamma befejezi doktori disszertációját, és az USA -ba költözik , ahol Richard Helmmel (Richard Helm), Ralph Johnsonnal (Ralph Johnson) és John Vlissidesszel (John Vlissides) együttműködve kiadja a Design Patterns - könyvet. Az újrafelhasználható objektum-orientált szoftver elemei . Ez a könyv 23 tervezési mintát ír le. Ezen kívül a könyv szerzőinek csapatát "Gang of Four" néven ismeri a nyilvánosság ( eng. Gang of Four , gyakran rövidítve GoF -re ). Ez a könyv okozta a tervezési minták népszerűségének növekedését.
A teljesen független tervezéshez képest a sablonok számos előnnyel rendelkeznek. A sablonok használatának fő előnye, hogy kész absztrakciókkal csökkenti a fejlesztés bonyolultságát, hogy megoldja a problémák egész osztályát. A sablon adja a megoldás nevét, ami megkönnyíti a fejlesztők közötti kommunikációt azáltal, hogy lehetővé teszi a jól ismert sablonokra való hivatkozásokat. Így a sablonok miatt egységesülnek a megoldások részletei: modulok, projektelemek, és csökken a hibák száma. A sablonok alkalmazása elvileg hasonló a kész kódkönyvtárak használatához. A jól megfogalmazott tervezési minta lehetővé teszi, hogy a jó megoldás megtalálása után újra és újra felhasználható legyen. Egy sablonkészlet segíti a fejlesztőt a lehetséges, legmegfelelőbb tervezési lehetőség kiválasztásában. [egy]
Míg a kód egyszerű módosítása, hogy illeszkedjen egy ismert mintához, könnyebben érthetővé teheti a kódot, Steve McConnell szerint két probléma van a minták használatával. Először is, egy kiválasztott minta vak követése a program bonyolultságához vezethet. Másodszor, a fejlesztők kísértést érezhetnek, hogy minden különösebb ok nélkül kipróbáljanak egy bizonyos mintát (lásd Golden Hammer ). [2]
Az objektum-orientált tervezésben számos tervezési minta a funkcionális nyelvek elemeinek idiomatikus reprodukciójaként fogható fel [3] . Peter Norvig azt állítja, hogy a Gangs of Four -ban leírt 23 minta közül 16 sokkal könnyebben megvalósítható dinamikusan tipizált nyelveken, mint C++- ban, vagy láthatatlan [4] . Paul Graham a tervezési minták gondolatát antimintának tekinti , annak jelzésére, hogy a rendszer nem rendelkezik kellő absztrakciós szinttel , és gondosan át kell dolgozni [5] . Könnyen belátható, hogy a sablon definíciója „ kész megoldás, de nem közvetlen könyvtárhívás ” lényegében az újrafelhasználás elutasítását jelenti a duplikáció javára . Ez nyilvánvalóan elkerülhetetlen lehet összetett rendszerek esetén, ha olyan nyelveket használnak, amelyek nem támogatják a kombinátorokat és a típuspolimorfizmust , és elvileg kizárható azokban a nyelvekben, amelyek rendelkeznek homoikonitás tulajdonsággal (bár nem feltétlenül hatékonyan), mivel bármilyen minta végrehajtható kódban kell megvalósítani [6] .
Név | eredeti név | Leírás | Leírása: Tervezési minták |
---|---|---|---|
Alapsablonok (alapvető) | |||
Delegációs minta | delegálási minta | Egy objektum kívülről fejez ki valamilyen viselkedést, de valójában egy társított objektumra ruházza át e viselkedés végrehajtásának felelősségét. | n/a |
funkcionális tervezősablon | funkcionális kialakítás | Gondoskodik arról, hogy egy számítógépes program minden egyes moduljának csak egy felelőssége legyen, és azt minimális mellékhatással hajtja végre a program más részein. | n/a |
Változatlan interfész | Változatlan interfész | Megváltozhatatlan objektum létrehozása . | n/a |
Felület | Felület | Általános módszer a számítógépes programok könnyebb érthetőségű strukturálására. | n/a |
Interfész jelölő | Marker felület | Attribútumként (egy entitás jelöléseként) a marker interfész implementációjának megléte vagy hiánya kerül felhasználásra. A modern programozási nyelvek ehelyett attribútumokat vagy megjegyzéseket használhatnak. | n/a |
Property Container | ingatlan konténer | Lehetővé teszi további tulajdonságok hozzáadását az osztályhoz a tárolóhoz (az osztályon belül), ahelyett, hogy az osztályt új tulajdonságokkal bővítené. | n/a |
Esemény csatorna | esemény csatorna | Kibővíti a Közzététel/Feliratkozás mintát , hogy központi csatornát hozzon létre az események számára. Meghatalmazottat használ az előfizetéshez és egy proxyt az esemény közzétételéhez a csatornán. A képviselő a tényleges kiadótól vagy előfizetőtől külön létezik. Egy előfizető egynél több entitástól kaphat közzétett eseményeket, még akkor is, ha csak egy csatornára van regisztrálva. | n/a |
A kreatív minták olyan tervezési minták, amelyek elvonatkoztatják a példányosítás folyamatát. Lehetővé teszik a rendszer függetlenítését az objektumok létrehozásának, összeállításának és bemutatásának módszerétől. Az osztályokat létrehozó sablon az öröklést használja a példányosított osztály módosításához, míg az objektumokat generáló sablon a példányosítást egy másik objektumra delegálja. | |||
Absztrakt gyár | absztrakt gyár | Osztály, amely interfészt jelent a rendszerkomponensek létrehozásához. | Igen |
Építész | Építész | Osztály, amely egy komplex objektum létrehozására szolgáló interfészt jelent. | Igen |
gyári módszer | gyári módszer | Interfészt határoz meg egy objektum létrehozásához, de az alosztályokra bízza, hogy eldöntsék, melyik osztályt példányosítsák. | Igen |
Lusta inicializálás | Lusta inicializálás | Olyan objektum, amely az első hozzáféréskor inicializálódik. | Nem |
Többhangú | Többhangú | Győződjön meg arról, hogy az osztály elnevezett objektumpéldányokat, és globális hozzáférési pontot biztosít számukra. | Nem |
Tárgykészlet | objektumkészlet | Osztály, amely interfészt jelent az inicializált és használatra kész objektumok halmazával való munkavégzéshez. | Nem |
Prototípus | prototípus | Meghatároz egy felületet egy objektum létrehozásához egy másik objektum klónozásával, ahelyett, hogy egy konstruktoron keresztül hozná létre. | Igen |
Az erőforrás-beszerzés inicializálás | Az erőforrás-beszerzés inicializálás (RAII) | Az erőforrások megszerzése inicializálással, a felszabadítás pedig az objektum megsemmisítésével párosul. | Nem |
magányos | Szingli | Egy osztály, amelynek csak egy példánya lehet. | Igen |
A strukturális sablonok (Structural) különféle összetett struktúrákat határoznak meg, amelyek megváltoztatják a meglévő objektumok felületét vagy annak megvalósítását, megkönnyítve a program fejlesztését és optimalizálását. | |||
Adapter | Adapter/csomagoló | Olyan objektum, amely lehetővé teszi két másik objektum interakcióját, amelyek közül az egyik használja, a másik pedig olyan interfészt biztosít, amely nem kompatibilis az elsővel. | Igen |
Híd | Híd | Olyan struktúra, amely lehetővé teszi a hívási felület és az osztálymegvalósítási felület egymástól függetlenül történő megváltoztatását. | Igen |
linker | Összetett | Olyan objektum, amely magához hasonló tárgyakat egyesít. | Igen |
Dekorátor vagy csomagoló | lakberendező | Osztály, amely kiterjeszti egy másik osztály funkcionalitását öröklés nélkül. | Igen |
Homlokzat | homlokzat | Egy objektum, amely absztrahál több osztályt egyetlen entitásba egyesítve. | Igen |
Egyetlen belépési pont | elülső vezérlő | Egységes interfészt biztosít egy alrendszer interfészei számára. A Front Controller magas szintű interfészt határoz meg, amely leegyszerűsíti az alrendszer használatát. | Nem |
opportunista | Légysúly | Ez egy olyan objektum, amely egyedi példányként jelenik meg a program különböző helyein, de valójában nem az. | Igen |
Helyettes | meghatalmazott | Olyan objektum, amely közvetít két másik objektum között, és amely megvalósítja/korlátozza a hozzáférést a rajta keresztül elért objektumhoz. | Igen |
Viselkedési minták határozzák meg az objektumok közötti interakciót, így növelve annak rugalmasságát. | |||
Felelősségi lánc | Felelősségi lánc | Úgy tervezték, hogy megszervezze a felelősségi szinteket a rendszerben. | Igen |
Parancs , művelet, tranzakció | parancs | Egy cselekvést képvisel. A parancsobjektum magát a műveletet és annak paramétereit tartalmazza. | Igen |
Tolmács | tolmács | Megold egy gyakori, de változékony problémát. | Igen |
Iterátor , kurzor | Iterátor | Olyan objektumot jelöl, amely lehetővé teszi, hogy szekvenciálisan hozzáférjen az összesített objektum elemeihez anélkül, hogy az összesítés részét képező objektumok leírását használná. | Igen |
Közvetítő | közvetítő | Sok objektum interakcióját biztosítja, miközben laza csatolást hoz létre, és kiküszöböli annak szükségességét, hogy az objektumok kifejezetten utaljanak egymásra. | Igen |
Az őrző | Emlékeztető | Lehetővé teszi egy objektum belső állapotainak rögzítését és mentését a tokozás megsértése nélkül , hogy később vissza lehessen állítani ezekben az állapotokban. | Igen |
Null Object | Null Object | Egy "alapértelmezett" objektum megadásával megakadályozza a nulla mutatókat. | Nem |
Megfigyelő vagy kiadó-előfizető | Megfigyelő | Egy a többhez függőséget határoz meg az objektumok között, így amikor egy objektum állapota megváltozik, minden tőle függő függő értesítést kap az eseményről. | Igen |
szolga | Szolgáló | Arra használják, hogy közös funkciókat biztosítsanak egy osztálycsoport számára. | Nem |
Leírás | Leírás | Az üzleti logika megkötésére szolgál. | Nem |
Állapot | Állapot | Olyan esetekben használják, amikor a program végrehajtása során az objektumnak állapotától függően meg kell változtatnia viselkedését. | Igen |
Stratégia | Stratégia | Célja, hogy meghatározza az algoritmusok családját, mindegyiket beágyazza, és biztosítsa felcserélhetőségüket. | Igen |
sablon módszer | sablon módszer | Meghatározza az algoritmus alapját, és lehetővé teszi a leszármazottak számára az algoritmus egyes lépéseinek újradefiniálását anélkül, hogy a szerkezet egészét megváltoztatná. | Igen |
Látogató | Látogató | Leír egy műveletet, amelyet más osztályok objektumain hajtanak végre. Amikor a Visitor osztály megváltozik, nincs szükség a kiszolgált osztályok módosítására. | Igen |
Egyszerű politika | egyszerű politika | Nem | |
eseményhallgató | eseményhallgató | Nem | |
Egyszeri látogató | Egyszeri látogató | Optimalizálja a látogatói minta megvalósítását, amelyet inicializálnak, egyszer felhasználnak, majd megsemmisítenek. | Nem |
Hierarchikus látogató | Hierarchikus látogató | Lehetővé teszi egy hierarchikus adatstruktúra (pl. fa) összes csúcsának bejárását. | Nem |
Egyidejűség – Egyidejűség
Többszálú programok hatékonyabb írásához , és kész megoldások biztosításához a szinkronizálási problémákra .
Név | eredeti név | Leírás |
---|---|---|
Aktív objektum | aktív objektum | Arra szolgál, hogy a metódus végrehajtási szálát elválasztja attól a száltól, amelyben meghívták. Az aszinkron metódushívási és ütemezőmintákat használja. |
Balking | Balking | Csak akkor használható művelet végrehajtására egy objektumon, ha az megfelelő állapotban van. |
Kötési tulajdonságok | Több megfigyelőt kombinál, hogy a tulajdonságokat szinkronban tartsa a különböző objektumok között [7] . | |
Üzenetküldés | Üzenetküldési minta, Üzenetkezelési minta (MDP) | Lehetővé teszi az összetevők és alkalmazások számára az információcserét (üzeneteket). |
Kétszeres ellenőrzés blokkolás | Duplán ellenőrzött zár | Úgy tervezték, hogy csökkentse a zár megszerzésével járó többletköltséget. |
Eseményalapú | Esemény alapú aszinkron | Az aszinkron mintával kapcsolatos problémák megoldása, amelyek többszálú programokban jelentkeznek [8] . |
Őrzött felfüggesztés | Védett felfüggesztés | Csak akkor blokkolja a művelet végrehajtását egy objektumon, ha az megfelelő állapotban van. |
Félszinkron/Fél aszinkron | ||
Vezetők/követők | ||
blokkolása | zár | Az egyik szál zárolja az erőforrást, hogy megakadályozza, hogy más szálak hozzáférjenek vagy módosítsák [9] . |
Monitor | Monitor | Egynél több szál által biztonságosan használható objektum. |
reaktor_ | Reaktor | Úgy tervezték, hogy egy vagy több forrásból szinkron módon továbbítsa a kéréseket a szolgáltatásnak. |
Olvasási/írási | Olvasási/írási zár | Lehetővé teszi, hogy egyszerre több szál is olvasson információkat a megosztott tárhelyről, de egyszerre csak egy szál módosíthatja azokat. |
Ütemező | Ütemező | Mechanizmust biztosít egy ütemezési házirend megvalósításához anélkül, hogy bármilyen konkrét irányelvtől függne. |
szálkészlet | Szálkészletet biztosít a feladatok feldolgozásához, általában várólistaként ábrázolva. | |
Szálspecifikus tárhely | Különböző globális változók biztosítására szolgál a különböző szálakhoz. | |
Egyszálú végrehajtás | egyszálas végrehajtás | Megakadályozza egy metódus egyidejű meghívását, ezáltal megakadályozza a metódus egyidejű végrehajtását. |
Kooperatív minta | kooperatív minta | Mechanizmust biztosít a végrehajtási szálak biztonságos leállításához egy közös jelző használatával a szál befejezésének jelzésére. |
Ma még számos más sablon is létezik.
Tervezési minták | |
---|---|
Fő | |
Generatív | |
Szerkezeti | |
Viselkedési | |
Párhuzamos programozás |
|
építészeti |
|
Java EE sablonok | |
Egyéb sablonok | |
Könyvek | |
Személyiségek |