Biologie | Chimie | Didactica | Fizica | Geografie | Informatica | |
Istorie | Literatura | Matematica | Psihologie |
Modelul Flyweight
Modelul Flyweight este utilizat pentru a evita nr mare de cazuri similare . Exista cazuri in programare in care este nevoie de generarea un numar de matrice primare pentru a reprezenta date. Uneori, puteti reduce numarul de matrice diferite de care aveti nevoie si care sunt imprescindibile inrecunoasterea unor instantele asemanatoare care sunt fundamental aceleasi, cu exceptia catorva parametri. Daca puteti scoate aceste variabile fara sa le treceti ca parte a unui apel metoda, numarul de cazuri separate pot fi reduse in mare masura prin distribuirea lor.
Flyweight abordareaza manipularea acestor clase. Ne referim la datele instantei intrinseci care dauunui caz unicitate si la datele extrinseci, care au functie de argumente. Programul este adecvat pentru clasele mici,unitati micicum ar fi caracterele individuale sau pictogramele de pe ecran. De exemplu, ati putea desena o serie de pictograme pe ecran sau intr-o fereastra, unde fiecare pictogramareprezinta o persoana sau fisier de date , ca in, figura 19-1.
Figura 19-1. Un set de dosare, reprezentand informatii despre diferite persoane. Deoarece acestea sunt atat de asemanatoare, ele sunt candidate pentru programul Flyweight.
In acest caz, nu are
sens existenta unui caz individual pentru fiecare folder
pe care aminteste numele
persoanei si pozitia pictogramei de pe
ecran. De obicei, aceste icoane sunt cateva imagini similare, si pozitia
in care acestea sunt
colocate se calculeaza dinamic, bazat pe marimea
ferestrei pt fiecare caz
Modele de Design ofera
un alt exemplu , fiecare personaj
intr-un document este
reprezentat ca fiind
un caz singular apartinand unei clase anume , dar
pozitiile in care personajul este desenat pe ecran
suntpastrate ca si date externe.
In acest caz,
fiecare exemplu are apartenenta la o anumita clasa mai degraba decat ca o clasa sa apartina unei
anumite insusiri a unui exemplu .
Discutie
Flyweights sunt exemple
de clase care pot
fi imprumutate . S-ar putea parea
la prima vedere ca fiecare clasa este
un Singleton, dar,
de fapt, ar putea fi vorba de un numar mic de cazuri, cum ar fi unul pentru
fiecare caracter sau
unul pentru fiecare tip de iconograma . Numarul
de instante alocate trebuie sa fie hotarate in
functie de nr de cazuri de clasa necesare, iar acest lucru este realizat,
de obicei, cu FlyweightFactory. Aceasta clasa Factory,
de obicei, este un Singleton, deoarece este
nevoie de a urmari daca
un caz particular a fost generat inca.
Apoi fie raspunde fie cu un exemplu nou sau o trimitere la unul generat deja.
Pentru a decide daca
o parte a programului dumneavoastra poate utiliza Flyweights, luati in
considerare posibilitateaeliminarii unor date si incorporarea
programului . Acest
lucru face posibila reducerea considerabila a numarului de cazurisi Flyweights va va ajuta.
Exemplu de cod
Sa presupunem ca dorim desenarea
unei pictograme de folder mic cu un nume sub el pentru fiecare persoana
dintr-o organizatie. Daca aceasta este o
organizatie mare, ar putea exista un numar mare de astfel de pictograme
, dar pentru toate avem aceeasi
reprezentare grafica. Chiar daca
avem doua pictograme unul pentru selectat' si unul pentru nu
selectat' numarul de pictograme
diferite este mic.
Intr-un astfel de sistem, avand un obiect pictograma pentru fiecare
persoana, cu propriile coordonatele , nume, stare
, este o risipa de resurse. Ne arata doua astfel de pictograme in Figura 19-2.
Figura 19-2. display
program cu un
singur folder selectat
In schimb, vom crea un FolderFactory care
returneaza si dosarul selectat
si neselectat , dar nu creeaza
exemple suplimentare odata ce a fost creat. Deoarece
acesta este un astfel de caz simplu, noi doar le-am creat inceputul apoi le-am
restituit intr-un fel sau altul
Pentru cazurile
in care ar putea exista mai multe exemple
, ar putea fi stocatao situatie a
celor deja createsi se vor crea altele
noi numai daca
acestea nu au
fost deja in tabel.
O particularitate a utilizarii Flyweights, insa, este faptul
ca trecem coordonatele
si numele care
vor etichetafolderul pe care il concepem. Aceste coordonate sunt
date extrinseci care
ne permit imprumutatea obiectelor din dosar si,
in aceasta caz,
permit crearea a doar doua instante.
Cazul dosarului complet prezentat aici
creeaza pur si simplu o
cazuistica de dosar cu o singura culoare de
fundal si are o metoda de concepere publica care se adapteaza in functie
de cerinte
Pentru a utiliza o optiune Flyweight programul principal trebuie sa calculeze pozitia fiecarui dosar, ca si rutina , si apoi sa treaca toate coordonatele dosarului in cauza . Aceasta este de fapt o actiune destul de comuna, deoarece ai nevoie de dimensiunile ferestrei, iar tu nu ai vrea sa ai de reamintit fiecarui caz unde va fi amplasat rezultatul
Aici avertizam ca s-ar putea sa fi generat o ArrayList de dosare de la bun inceput si pur si simplu am scanat prin matrice pentru a muta fiecare folder. O astfel de matrice nu este considerata de risipa , deoarece acesta este de fapt o serie de trimiteri la unul dintre cele doua cazuri . Cu toate acestea, daca vrem sa afiseze un folder ca selectat', si am dori sa fie posibil sa schimbam in mod dinamic dosarul , vom folosi doar FolderFactory in sine pentru a ne da exemplu corect de fiecare data.
Exista doua locuri in rutina noastra afisate in cazul in care avem nevoie de calcularea pozitiilor de dosare: atunci cand le mutam si atunci cand vom verifica cu un mouse . Astfel, este convenabil sa abstractizam codul de pozitionare intr-o clasa Positioner.
public class PositionerApoi, putem scrie o rutina mult mai simplu
Diagrama de clase
diagrama din Figura 19-3 arata modul
in care aceste clase interactioneaza.
Figura 19-3. Cum Flyweights
sunt generate
clasa FlyCanvas este principala clasa UI, in cazul in
care dosarele sunt aranjate si mutate
. Acesta contine un exemplu FolderFactory si un exemplu din categoria Folder. Clasa FolderFactory contine
doua cazuri de
Folder: selectate si neselectate. Unul
sau altul dintre acestea
este returnat FlyCanvas de catre FolderFactory
Selectarea unui folder
Din moment ce avem doua tipuri de dosar, selectate
si neselectate , am dori sa putem selecta dosarele, prin plasarea mouse-ul peste ele. In cazul anterior, amintim pur si simplu numele folderului selectat si cerem
revenirea la dosarul selectat . Avand in
vedere ca dosarele nu
sunt cazuri individuale,
nu putem pune baza pe miscarea mouse-ului in fiecare
caz . De fapt, chiar daca ne-am baza pe un dosar,
am nevoie de o
modalitate de a spune
altor instante sa se auto
deselecteze.
In schimb, vom verifica miscarea mouse-ului la nivel Picturebox, si daca mouse-ul este dovedit a fi intr-un Rectangle-dreptunghi-, facem ca numele sa corespunda numelui selectat. Vom crea o singura instanta a unei clase Rectangle cazul in care testarea se poate face pentru a stabili daca un folder contine mouse-ul in acel moment. Retineti ca facem aceasta clasa parte a csPatterns nume,spatiu pentru a va asigura ca nu se ciocneste cu clasa RECTANGLE in System.Spatiu destinat scrierii numelui
Acest lucru va permite doar verificareanumelui atunci cand am redesenam si cream un dosar acolo unde este nevoie.
private void Pic_MouseMove(object sender, MouseEventArgs e)
Utilizarea Flyweights(categoriei musca) in C#
Flyweights nu sunt
frecvent utilizate la nivel de
aplicatie in C . Ele sunt mai mult de
o tehnica de gestionare a resurselor de sistem folosit
la un nivel mai
scazut decat C . Cu toate acestea, exista
o serie de cazuri gasite pe Internet,
care sunt oarecum similare Flyweights. Este
util, in general, sa
recunoastem ca exista
aceasta tehnica astfel incat sa o puteti folosi
in cazul in care aveti nevoie.
Unele obiecte in limbajul C # ar putea fi puse in aplicare sub o aparitie similara Flyweights. De exemplu, in cazul in care exista doua cazuri String cu caractere identice, acestea ar putea face referire la acelasi loc de depozitare . In mod similar, ar putea fi ca doua integer sau float constantele care contin aceeasi valoare ar putea fi puse in aplicare Flyweights, desi probabil ca nu sunt.
Obiecte partajabile
Companion Smalltalk subliniaza
ca obiectele partajate sau sharate seamana mult cu Flyweights,
desi scopul este
oarecum diferit. Cand aveti
un program foarte mare
care contine o multime de date
complexe, cum ar fi
tabele sau bitmap,
v-ar dori sa
se reduca la minimum numarul de
sabloane . In schimb, in astfel de cazuri, te-ai intoarce un sablon la
fiecare parte a
programului care o solicita pentru a
evita crearea de sabloane suplimentare
O problema cu astfel de obiecte poate
aparea atunci
cand o parte a unui program doreste
sa schimbe unele date intr-un sistem
comun. Apoi trebuie
decisa daca sa
schimbarea obiectului trebuie
facuta pentru toti utilizatorii, trebuie sa se impiedice orice
modificare, sauva trebui sa realizam crearea unei instante
cu datele modificate. Daca schimbarea obiectului de fiecare exemplu,
va trebui sa le notifice ca obiectul
sa schimbat.
Obiecte sharate sau imprumutate sunt utile atunci cand ne referim la sistemele mari de
date in afara de
C , cum ar
fi de ex bazele de date. Clasa de DBase dezvoltata
anterior in modelul
Faccade ar putea fi
un candidat pentru un imprumutarea sau sharingul unui obiect.
Noi nu am putea
dori un numar
de conexiuni separate
la baza de date de
la diferite module de program, preferand ca
doar unul sa fie implementat. Cu toate acestea, ar trebui mai multe module diferite
sa faca solicitari in acelasi timp, clasa de baza de date ar putea stopa
sau intrerupe conexiunile
suplimentare.
Copy-on Scrie Obiecte
Modelul Flyweight foloseste doar cateva exemple pentru a reprezenta mai multe obiecte diferite
intr-un program. Toate
acestea au in mod
normal, aceleasi proprietati ca baza de date intrinseci si cateva
proprietati care reprezinta date extrinseci care
variaza cu fiecare
manifestare in parte . Cu toate acestea, s-ar putea intampla ca unele dintre aceste cazuri sa aiba
doar proprietati intrinseci noi cum
ar fi forma sau
pozitia dosar fila) si necesita
un nou caz specific al clasei care sa le reprezinte. ,
Mai degraba decat crearea
in avans, ca subclase speciale, este posibil sa
copiati exemplul de clasa si sa schimbati proprietatile sale intrinseci atunci cand fluxul
programului indica faptul ca o noua instanta separata este necesara.
Programul copiaza el insusi datele respective cand schimbarile devin
inevitabile ,schmband astfel proprietatile intrinseci in noua clasaNoi numim acest proces
copy-on-write' si
poate construi acest lucru in in Flyweights,
precum si in alte programe cum ar fi
Proxy, pe care vom
discuta despre viitor.
Copyright © 2024 - Toate drepturile rezervate