|
|
Julkaistu 30.7.2018 10.30.45
|
|
|

Johdanto
Flyweight-tila tukee tehokkaasti suurta määrää hienojakoisia objekteja ajamalla jakamisteknologiaa, välttäen suuren määrän saman sisällön sisältävien luokkien (kuten muistin kulutuksen) ylikuormituksen ja sallien kaikkien jakaa yhden luokan (meta-luokka).
Ohjelmoinnissa on joskus tarpeen tuottaa suuri määrä hienojakoisia luokkainstansseja datan esittämiseksi, ja jos näillä instansseilla on käytännössä sama ylikuorma muutamaa parametria lukuun ottamatta, luokkien määrä voidaan merkittävästi pienentää. Jos voit siirtää nämä parametrit luokka-instanssin ulkopuolelle ja välittää ne sisään, kun metodia kutsutaan, voit vähentää yksittäisten instanssien määrää jakamalla.
Mitä sitten, jos soveltaisit metatilaa JavaScriptissä? On kaksi tapaa: ensimmäinen sovelletaan datakerrokseen, pääasiassa suureen määrään samankaltaisia objekteja muistissa; Toinen lisäys on DOM-kerrokseen, jota voidaan käyttää keskustapahtumanhallinnassa välttämään tapahtumakahvojen liittäminen jokaiseen lapsielementtiin vanhemmassa kontissa.
Nauti metaversumista ja datakerroksista
Flyweightissa on kaksi tärkeää käsitettä – sisäinen tila sisäinen ja ulkoinen tila ulkoinen; sisäistä tilaa hallitaan objektissa sisäisin menetelmin, ja ulkoinen tieto voidaan poistaa tai tallentaa ulkoisesti.
Suoraan sanottuna se tarkoittaa ensin alkuperäisen mallin nipistämistä, sitten eri tilanteissa ja ympäristöissä, ja sen jälkeen tiettyjen mallien tuottamista omine ominaisuuksineen, tietenkin eri uusia objekteja täytyy tuottaa tässä, joten tehdastila esiintyy usein Flyweight-tilassa, Flyweightin sisäinen tila jaetaan ja Flyweight-tehdas vastaa Flyweight-poolin (kuviopoolin) ylläpidosta sisäisen tilan objektien tallentamiseen.
Käytä Yuanyuan-tilaa
Näytetään, että jos meillä olisi kirjasto, joka hallinnoisi kaikkia kirjoja, jokaisen kirjan metatiedot näyttäisivät alustavasti tältä:
ID Nimike Kirjailija Genre Sivumäärä Julkaisijan tunnus ISBN Meidän täytyy myös määritellä, milloin ja kenen toimesta kukin kirja lainattiin, sekä palautuspäivä ja saatavuus:
katso ulos Päivämäärä checkoutJäsen dueReturnDate Saatavuus Koska kirja-objekti on asetettu seuraavaan koodiin, huomaa, että koodia ei ole vielä optimoitu:
Ohjelma voi toimia aluksi hyvin, mutta ajan myötä kirjojen määrä voi kasvaa suurissa määrissä, ja jokaisella kirjalla on oma versio ja määränsä, ja huomaat, että järjestelmä hidastuu yhä enemmän. Tuhansia kirjan objekteja voi kuvitella muistissa, ja meidän täytyy optimoida ne jakamismoodilla.
Voimme jakaa datan kahteen tyyppiin: sisäiseen ja ulkoiseen, ja kirjan objektiin liittyvä data (otsikko, tekijä jne.) voidaan liittää sisäisiin attribuutteihin, kun taas (checkoutMember, dueReturnDate jne.) voidaan liittää ulkoisiin attribuutteihin. Näin seuraava koodi voi jakaa saman objektin samassa kirjassa, koska riippumatta siitä, kuka kirjan lainaa, niin kauan kuin kirja on sama kirja, perustiedot ovat samat:
Määrittele perustehdas
Määritellään perustehdas, joka tarkistaa, onko kirjan objekti luotu aiemmin, palautetaan jos on, ja luodaan uudelleen ja tallennetaan jos ei, mikä varmistaa, että luomme vain yhden objektin jokaiselle kirjatyypille:
Hallinnoi ulkoista tilaa
Ulkoinen tila on suhteellisen yksinkertainen, lukuun ottamatta kirjaa, jonka kapseloimme, kaikki muu täytyy hallita tässä:
Näin voimme tallentaa saman tiedon samasta kirjasta kirjanhallintaobjektiin, ja vain yhden kappaleen; Aiempaan koodiin verrattuna on havaittavissa, että paljon muistia on tallennettu.
Nauti meta-tilasta ja DOM:sta
En puhu paljoa DOM-kuplimistapauksesta, uskon että kaikki tietävät jo, annetaan kaksi esimerkkiä.
Esimerkki 1: Keskitetty tapahtumien hallinta Esimerkiksi, jos meillä on monia samankaltaisia elementtejä tai rakenteita (kuten valikoita tai useita li:tä ul:ssa), jotka tarvitsevat hänen klikkaustapahtumansa seuraamista, meidän täytyy sitoa jokainen lisäelementti tapahtumasidontaan; jos elementtejä on hyvin, hyvin paljon, suorituskyky voidaan kuvitella, ja yhdistettynä kuplimisen tuntemukseen jokin lapsielementti laukaisee, tapahtuma kuplii korkeampaan elementtiin laukaistuessaan, joten tämän ominaisuuden avulla voimme käyttää Xiangyuan-tilaa. Voimme seurata näiden samankaltaisten elementtien emoelementtien tapahtumia ja määrittää, mikä lapsielementti saa tapahtuman ennen jatkotoimia.
Tässä yhdistämme jQueryn bind/unbind-menetelmät esimerkiksi.
HTML:
JavaScript:
Esimerkki 2: Sovella Xiangyuan-tilaa suorituskyvyn parantamiseksi
Toinen esimerkki, joka liittyy edelleen jQueryyn, käytämme yleensä elementtiobjektia tapahtuman callback-funktiossa, käytämme usein muotoa $(this), itse asiassa se luo toistuvasti uuden objektin, koska tämä callback-funktiossa on jo itse DOM-elementti, meidän täytyy käyttää seuraavaa koodia:
Itse asiassa, jos meidän täytyy käyttää jotain kuten $(this), voimme myös toteuttaa oman versionsa yksittäisestä instanssikuviosta, esimerkiksi voimme toteuttaa funktion kuten jQuery.signle(this), joka palauttaa itse DOM-elementin:
Näin käytetään:
Tämä palauttaa DOM-elementin sellaisenaan, ilman että jQuery-objektia syntyy.
yhteenveto
Flyweight-tila on tila, joka parantaa ohjelman tehokkuutta ja suorituskykyä, mikä nopeuttaa ohjelman suoritusnopeutta huomattavasti. Sovelluksia on monia: esimerkiksi jos haluat lukea sarjan merkkijonoja tietokannasta, joista monet ovat duplikaatteja, voimme tallentaa nämä merkkijonot Flyweight-pooliin.
Jos sovellus käyttää suurta määrää objekteja ja nämä suuret objektimäärät aiheuttavat paljon tallennustilaa, sen tulisi harkita jakamistilan käyttöä; Jos poistat objektin ulkoisen tilan, voit korvata monia olioryhmiä suhteellisen vähillä jaetuilla objekteilla, ja voit harkita Xiangyuan-tilan käyttöä.
Viiteosoite:http://www.addyosmani.com/resour ... ok/#detailflyweight
|
Edellinen:Suosittelen kolmea verkkosivustoa ikonikuvakkeiden löytämiseksiSeuraava:Odottavien viestien määrä, Viestit jonossa, Viesti...
|