|
|
Postat pe 30.07.2018 10:30:45
|
|
|

Introducere
Modul flyweight suportă eficient un număr mare de obiecte detaliate prin rularea tehnologiei de partajare, evitând efortul unui număr mare de clase mici cu același conținut (cum ar fi consumul memoriei) și permițând tuturor să împartă o clasă (meta-clasă).
În programare, uneori este necesar să se producă un număr mare de instanțe de clase cu granulație fină pentru a reprezenta datele, iar dacă poți descoperi că aceste instanțe au practic aceeași responsabilitate, cu excepția câtorva parametri, numărul de clase care trebuie instanțiate poate fi redus considerabil. Dacă poți muta acei parametri în afara instanței clasei și să-i trimiți când metoda este apelată, poți reduce semnificativ numărul instanțelor individuale prin partajare.
Și ce dacă aplici modul meta în JavaScript? Există două moduri: primul se aplică stratului de date, în principal unui număr mare de obiecte similare în memorie; Al doilea este aplicat stratului DOM, care poate fi folosit pe managerul central de evenimente pentru a evita atașarea de handle-uri de eveniment fiecărui element copil din containerul părinte.
Bucură-te de metavers și straturile de date
Există două concepte importante în Flyweight - starea internă intrinsecă și starea externă extrinsecă, starea internă este gestionată în obiect prin metode interne, iar informațiile externe pot fi șterse sau salvate extern.
Ca să fiu direct, este vorba de a prelua mai întâi un model original, apoi, în diferite ocazii și medii, și apoi de a produce modele specifice cu propriile caracteristici; evident, aici trebuie generate obiecte noi diferite, astfel încât modul fabricii apare adesea în modul Flyweight, starea internă a Flyweight este folosită pentru partajare, iar fabrica Flyweight este responsabilă pentru menținerea unui pool Flyweight (pool de modele) pentru a stoca obiectele din starea internă.
Folosește modul Yuanyuan
Să demonstrăm că, dacă am avea o bibliotecă care să gestioneze toate cărțile, metadatele pentru fiecare carte ar arăta provizoriu astfel:
ID Titlu Autor Gen Număr de pagini ID-ul editorului ISBN De asemenea, trebuie să definim când și de către cine a fost împrumutată fiecare carte, precum și data returnării și disponibilitatea:
Data finalizării checkoutMember DueReturnDate Disponibilitate Deoarece obiectul book este setat pe următorul cod, rețineți că codul nu a fost încă optimizat:
Programul poate fi în regulă la început, dar în timp, numărul de cărți poate crește în cantități mari, iar fiecare carte are o versiune și o cantitate diferită, iar vei observa că sistemul devine tot mai lent. Mii de obiecte cărți în memorie pot fi imaginate și trebuie să le optimizăm cu modul de partajare.
Putem împărți datele în două tipuri de date: interne și externe, iar datele legate de obiectul cărții (titlu, autor etc.) pot fi atribuite atributelor interne, în timp ce (checkoutMember, dueReturnDate, etc.) pot fi atribuite atributelor externe. Astfel, codul următor poate împărtăși același obiect în aceeași carte, pentru că, indiferent cine împrumută cartea, atâta timp cât cartea este aceeași carte, informația de bază este aceeași:
Definiți fabrica de bază
Să definim o fabrică de bază pentru a verifica dacă obiectul cărții a fost creat înainte, să returnăm dacă există, și să o recreăm și să o stocăm dacă nu, ceea ce asigură că creăm un obiect doar pentru fiecare tip de carte:
Gestionarea statutului extern
Starea externă este relativ simplă, cu excepția cărții pe care am cuprins-o, restul trebuie gestionat aici:
Astfel, putem salva aceleași informații din aceeași carte într-un obiect bookmanager și doar o singură copie; Comparativ cu codul anterior, se poate observa că se salvează multă memorie.
Bucură-te de modul meta și de DOM
Nu voi spune prea multe despre incidentul cu bulele din DOM aici, cred că toată lumea știe deja, să dăm două exemple.
Exemplul 1: Managementul centralizat al incidentelor De exemplu, dacă avem multe tipuri similare de elemente sau structuri (cum ar fi meniuri sau mai multe li în ul) care trebuie să monitorizeze evenimentul de click, atunci trebuie să legăm fiecare element suplimentar pentru legarea evenimentelor; dacă sunt foarte, foarte multe elemente, performanța poate fi imaginată, iar combinată cu cunoașterea bubulei, dacă orice element copil are un declanșator de eveniment, evenimentul va crește la elementul superior după declanșare, deci folosind această caracteristică putem folosi modul Xiangyuan. Putem monitoriza evenimentele elementelor părinte ale acestor elemente similare și apoi putem determina care element copil are un eveniment declanșat înainte de a continua operațiile.
Aici vom combina metodele bind/unbind ale jQuery ca exemplu.
HTML:
JavaScript:
Exemplul 2: Aplică modul Xiangyuan pentru a îmbunătăți performanța
Un alt exemplu, tot legat de jQuery, în general folosim obiectul element în funcția de callback a evenimentului, adesea folosim forma $(this), de fapt, creează în mod repetat un obiect nou, deoarece acesta în funcția de callback este deja elementul DOM în sine, trebuie să folosim următorul cod:
De fapt, dacă trebuie să folosim ceva de genul $(this), putem implementa și propria noastră versiune a modelului single-instant, de exemplu, putem implementa o funcție precum jQuery.signle(this) pentru a returna elementul DOM în sine:
Cum să folosești:
Aceasta returnează elementul DOM în sine așa cum este, fără a crea un obiect jQuery.
rezumat
Modul flyweight este un mod care îmbunătățește eficiența și performanța programului, ceea ce va accelera considerabil viteza de rulare a programului. Există multe aplicații: de exemplu, dacă vrei să citești o serie de șiruri dintr-o bază de date, multe dintre ele fiind duplicate, atunci putem stoca aceste șiruri într-un pool Flyweight.
Dacă o aplicație folosește un număr mare de obiecte, iar acest număr mare de obiecte aduce multă satisfacție la stocare, ar trebui să ia în considerare folosirea modului de partajare; Dacă ștergi starea externă a obiectului, poți înlocui multe grupuri de obiecte cu relativ puține obiecte partajate și poți lua în considerare folosirea modului Xiangyuan.
Adresă de referință:http://www.addyosmani.com/resour ... ok/#detailflyweight
|
Precedent:Recomand 3 site-uri pentru a găsi icoane de pictogramăUrmător:NumărulDeMesajeAșteptate, MesajeAliniate, Mesaje...
|