|
|
Paskelbta 2018-07-30 10:30:45
|
|
|

Įvadas
"Flyweight" režimas efektyviai palaiko daugybę smulkiagrūdžių objektų, paleisdamas dalijimosi technologiją, išvengdamas daugybės mažų klasių su tuo pačiu turiniu (pvz., atminties suvartojimo) ir leisdamas visiems dalytis klase (meta-klase).
Programuojant kartais reikia sukurti daug smulkiagrūdžių klasių egzempliorių, kad būtų galima atvaizduoti duomenis, ir jei pastebėsite, kad šie egzemplioriai iš esmės turi tas pačias pridėtines išlaidas, išskyrus kelis parametrus, klasių, kurias reikia sukurti, skaičių galima labai sumažinti. Jei galite perkelti šiuos parametrus už klasės egzemplioriaus ribų ir perduoti juos iškviečiant metodą, galite žymiai sumažinti atskirų egzempliorių skaičių bendrindami.
Taigi, ką daryti, jei pritaikysite meta režimą "JavaScript"? Yra du būdai, pirmasis taikomas duomenų sluoksniui, daugiausia daugybei panašių objektų atmintyje; Antrasis taikomas DOM sluoksniui, kurį galima naudoti centrinėje įvykių tvarkyklėje, kad nebūtų pridėtos įvykių rankenėlės prie kiekvieno antrinio elemento pirminiame konteineryje.
Mėgaukitės metavisata ir duomenų sluoksniais
Flyweight yra dvi svarbios sąvokos - vidinė būsena vidinė ir išorinė būsena, vidinė būsena objekte valdoma vidiniais metodais, o išorinė informacija gali būti ištrinta arba išsaugota išorėje.
Tiesiai šviesiai tariant, pirmiausia reikia suspausti originalų modelį, o paskui su skirtingomis progomis ir aplinka, o tada gaminti konkrečius modelius su savo ypatybėmis, akivaizdu, kad čia reikia generuoti skirtingus naujus objektus, todėl gamyklinis režimas dažnai pasirodo "Flyweight" režimu, dalijimuisi naudojama vidinė "Flyweight" būsena, o "Flyweight" gamykla yra atsakinga už "Flyweight" baseino (modelio baseino) priežiūrą vidinės būsenos objektams laikyti.
Naudokite Yuanyuan režimą
Parodykime, kad jei turėtume biblioteką, kuri tvarkytų visas knygas, kiekvienos knygos metaduomenys preliminariai atrodytų taip:
ID Titulinis Autorius Žanras Puslapių skaičius Leidėjo ID ISBN Taip pat turime apibrėžti, kada ir kas paėmė kiekvieną knygą, taip pat grąžinimo datą ir prieinamumą:
atsiskaitymo data checkoutMember dueReturnDate Prieinamumas Kadangi knygos objektas nustatytas į šį kodą, atkreipkite dėmesį, kad kodas dar neoptimizuotas:
Iš pradžių programa gali būti gera, tačiau laikui bėgant knygų skaičius gali padidėti dideliais kiekiais, o kiekviena knyga turi skirtingą versiją ir kiekį, ir pastebėsite, kad sistema tampa vis lėtesnė. Galima įsivaizduoti tūkstančius knygų objektų atmintyje, ir mes turime juos optimizuoti naudodami dalijimosi režimą.
Duomenis galime suskirstyti į dviejų tipų duomenis: vidinius ir išorinius, o duomenys, susiję su knygos objektu (pavadinimas, autorius ir kt.), gali būti priskirti vidiniams atributams, o (checkoutMember, dueReturnDate ir kt.) gali būti priskirti išoriniams atributams. Tokiu būdu šis kodas gali dalytis tuo pačiu objektu toje pačioje knygoje, nes nesvarbu, kas skolinasi knygą, kol knyga yra ta pati knyga, pagrindinė informacija yra ta pati:
Apibrėžkite pagrindinę gamyklą
Apibrėžkime pagrindinę gamyklą, kad patikrintume, ar knygos objektas buvo sukurtas anksčiau, grąžinkime, jei yra, ir atkurkime bei išsaugokime, jei ne, o tai užtikrina, kad sukursime tik objektą kiekvienam knygos tipui:
Išorinės būsenos valdymas
Išorinė būsena yra gana paprasta, išskyrus knygą, kurią mes įtraukėme, visa kita turi būti valdoma čia:
Tokiu būdu knygų tvarkyklės objekte galime išsaugoti tą pačią tos pačios knygos informaciją ir tik vieną kopiją; Palyginti su ankstesniu kodu, galima pastebėti, kad sutaupoma daug atminties.
Mėgaukitės meta režimu ir DOM
Apie DOM burbuliavimo incidentą čia daug nepasakysiu, manau, kad visi jau žino, pateiksime du pavyzdžius.
1 pavyzdys: centralizuotas incidentų valdymas Pavyzdžiui, jei turime daug panašių tipų elementų ar struktūrų (pvz., meniu arba kelis li ul), kuriems reikia stebėti jo paspaudimo įvykį, tada turime susieti kiekvieną kitą įvykio susiejimo elementą, jei yra labai, labai daug elementų, tada galima įsivaizduoti našumą ir kartu su žiniomis apie burbuliavimą, jei kuris nors antrinis elementas turi įvykio paleidiklį, tada suaktyvinus įvykis burbuliuos į aukštesnį elementą, todėl naudodamiesi šia funkcija galime naudoti Xiangyuan režimą. Galime stebėti šių panašių elementų pirminių elementų įvykius ir nustatyti, kuris antrinis elementas suaktyvintas prieš tęsdami tolesnes operacijas.
Čia kaip pavyzdį sujungsime "jQuery" susiejimo / atsiejimo metodus.
HTML:
JavaScript:
2 pavyzdys: taikykite Xiangyuan režimą, kad pagerintumėte našumą
Kitas pavyzdys, vis dar susijęs su "jQuery", paprastai įvykio atgalinio iškvietimo funkcijoje naudojame elemento objektą, dažnai naudojame formą $(tai), iš tikrųjų ji pakartotinai sukuria naują objektą, nes tai atgalinio skambinimo funkcijoje jau yra pats DOM elementas, turime naudoti šį kodą:
Tiesą sakant, jei turime naudoti kažką panašaus į $(this), taip pat galime įdiegti savo vieno egzemplioriaus modelio versiją, pavyzdžiui, galime įdiegti tokią funkciją kaip jQuery.signle(this), kad grąžintume patį DOM elementą:
Kaip naudoti:
Tai grąžina patį DOM elementą tokį, koks jis yra, nesukuriant jQuery objekto.
suvestinė
"Flyweight" režimas yra režimas, kuris pagerina programos efektyvumą ir našumą, o tai labai pagreitins programos veikimo greitį. Yra daugybė programų: pavyzdžiui, jei norite perskaityti eilučių seriją iš duomenų bazės, iš kurių daugelis yra dublikatai, šias eilutes galime saugoti "Flyweight" baseine.
Jei programa naudoja daug objektų ir šis didelis objektų skaičius sukelia daug saugyklos laimės, ji turėtų apsvarstyti galimybę naudoti bendrinimo režimą; Jei ištrinsite išorinę objekto būseną, daugelį objektų grupių galėsite pakeisti santykinai nedaug bendrai naudojamų objektų ir galite apsvarstyti galimybę naudoti Xiangyuan režimą.
Nuorodos adresas:http://www.addyosmani.com/resour ... ok/#detailflyweight
|
Ankstesnis:Rekomenduokite 3 svetaines, kuriose rasite piktogramų piktogramasKitą:NumberOfPendingMessages, MessagesEnqueued, Messag...
|