|
|
Opublikowano 30.07.2018 10:30:45
|
|
|

Wprowadzenie
Tryb flyweight skutecznie wspiera dużą liczbę drobnoziarnistych obiektów poprzez technologię współdzielenia, unikając narzutu związanego z dużą liczbą małych klas o tej samej zawartości (np. zużycie pamięci) oraz umożliwiając wszystkim współdzielenie klasy (meta-klasy).
W programowaniu czasem konieczne jest wygenerowanie dużej liczby drobnoziarnistych instancji klas do reprezentacji danych, a jeśli uda się zauważyć, że te instancje mają zasadniczo taki sam narzut z wyjątkiem kilku parametrów, liczba klas wymagających instancji może znacznie ograniczyć. Jeśli możesz przenieść te parametry poza instancję klasy i przekazać je w momencie wywołania metody, możesz znacznie zmniejszyć liczbę poszczególnych instancji poprzez udostępnianie.
A co z tego, że zastosujesz tryb meta w JavaScript? Istnieją dwa sposoby, pierwszy jest stosowany do warstwy danych, głównie do dużej liczby podobnych obiektów w pamięci; Druga jest stosowana do warstwy DOM, którą można używać w centralnym menedżerze zdarzeń, aby uniknąć przypisywania uchwytów zdarzeń do każdego elementu potomnego w kontenerze nadrzędnym.
Ciesz się metawersum i warstwami danych
W Flyweight istnieją dwie ważne koncepcje – stan wewnętrzny wewnętrzny i zewnętrzny zewnętrzny, stan wewnętrzny jest zarządzany w obiekcie metodami wewnętrznymi, a informacje zewnętrzne mogą być usuwane lub zapisywane zewnętrznie.
Mówiąc wprost, najpierw trzeba przyłapać oryginalny model, a potem przy różnych okazjach i środowiskach, a następnie produkować konkretne modele o własnych cechach, oczywiście tutaj trzeba generować nowe obiekty, więc tryb fabryczny często pojawia się w trybie Flyweight, wewnętrzny stan Flyweight służy do udostępniania, a fabryka Flyweight odpowiada za utrzymanie puli Flyweight (puli wzorców) do przechowywania obiektów stanu wewnętrznego.
Użyj trybu Yuanyuan
Pokażmy, że gdybyśmy mieli bibliotekę zarządzającą wszystkimi książkami, metadane każdej książki wyglądałyby wstępnie tak:
ID Tytuł Autor Gatunek Liczba stron ID wydawcy ISBN Musimy także określić, kiedy i przez kogo każda książka została wypożyczona, a także datę zwrotu i dostępność:
data wydawnienia checkoutMember terminZwrotuDaty Dostępność Ponieważ obiekt książki jest ustawiony na następujący kod, należy zauważyć, że kod nie został jeszcze zoptymalizowany:
Program może być na początku w porządku, ale z czasem liczba książek może rosnąć w dużych ilościach, a każda książka ma inną wersję i ilość, a system staje się coraz wolniejszy. Tysiące obiektów książek w pamięci można sobie wyobrazić i musimy je zoptymalizować w trybie udostępniania.
Dane możemy podzielić na dwa typy: wewnętrzne i zewnętrzne, a dane związane z obiektem książki (tytuł, autor itp.) można przypisać atrybutom wewnętrznym, natomiast (checkoutMember, dueReturnDate itd.) można przypisać atrybutom zewnętrznym. W ten sposób poniższy kod może dzielić ten sam obiekt w tej samej książce, ponieważ niezależnie od tego, kto ją pożycza, dopóki książka jest tą samą książką, podstawowe informacje pozostają takie same:
Zdefiniuj podstawową fabrykę
Zdefiniujmy podstawową fabrykę, aby sprawdzić, czy obiekt książki został wcześniej utworzony, zwróć, jeśli tak, a jeśli nie, odtworzyć i przechować, co zapewnia, że tworzymy obiekt tylko dla każdego typu książki:
Zarządzanie statusem zewnętrznym
Stan zewnętrzny jest stosunkowo prosty, poza książką, którą zapakowaliśmy, wszystko inne trzeba tu zarządzać:
W ten sposób możemy zapisać te same informacje z tej samej książki w obiekcie bookmanagera i tylko jedną kopię; W porównaniu z poprzednim kodem można zauważyć, że oszczędza się dużo pamięci.
Ciesz się trybem meta i DOM
Nie powiem tu wiele o incydencie z bąbelkami DOM, wierzę, że wszyscy już wiedzą, podam dwa przykłady.
Przykład 1: Scentralizowane zarządzanie incydentami Na przykład, jeśli mamy wiele podobnych typów elementów lub struktur (takich jak menu lub wiele li w ul), które muszą monitorować zdarzenie kliknięcia, to musimy przypisać każdy kolejny element do powiązania zdarzeń; jeśli jest ich bardzo, bardzo dużo, można sobie wyobrazić wydajność, a w połączeniu z wiedzą o bąbelkaniu, jeśli jakiś element potomny ma wyzwalanie zdarzenia, to zdarzenie przejdzie do wyższego elementu po wyzwalaniu, więc korzystając z tej funkcji, możemy użyć trybu Xiangyuan. Możemy monitorować zdarzenia elementów nadrzędnych tych podobnych elementów, a następnie określić, który element potomny ma wywołane zdarzenie, zanim przejdziemy do dalszych operacji.
Tutaj połączymy metody bind/unbind w jQuery jako przykład.
HTML:
JavaScript:
Przykład 2: Zastosowanie trybu Xiangyuan, aby poprawić wydajność
Inny przykład, nadal związany z jQuery, zazwyczaj używamy elementu obiektu w funkcji callback zdarzenia, często używamy formy $(this), która wielokrotnie tworzy nowy obiekt, ponieważ w funkcji callback jest już elementem DOM, musimy użyć następującego kodu:
W rzeczywistości, jeśli musimy użyć czegoś takiego jak $(this), możemy również zaimplementować własną wersję wzorca pojedynczej instancji, na przykład możemy zaimplementować funkcję taką jak jQuery.signle(this), aby zwrócić sam element DOM:
Jak użyć:
Zwraca to element DOM w stanie takim, jakim jest, bez tworzenia obiektu jQuery.
streszczenie
Tryb flyweight to tryb, który poprawia efektywność i wydajność programu, co znacznie przyspiesza jego bieg. Istnieje wiele zastosowań: na przykład, jeśli chcesz odczytać serię ciągów z bazy danych, z których wiele to duplikaty, możemy przechowywać te ciągi w puli Flyweight.
Jeśli aplikacja używa dużej liczby obiektów, a te duże obiekty powodują dużą satysfakcję pamięci, powinna rozważyć użycie trybu współdzielenia; Jeśli usuniesz zewnętrzny stan obiektu, możesz zastąpić wiele grup obiektów stosunkowo niewielką liczbą współdzielonych obiektów i rozważyć użycie trybu Xiangyuan.
Adres referencyjny:http://www.addyosmani.com/resour ... ok/#detailflyweight
|
Poprzedni:Polecam 3 strony internetowe z ikonami ikonNastępny:LiczbaOczekujących wiadomości, wiadomości w kolejce, wiadomości...
|