Home - Rasfoiesc.com
Educatie Sanatate Inginerie Business Familie Hobby Legal
Meseria se fura, ingineria se invata.Telecomunicatii, comunicatiile la distanta, Retele de, telefonie, VOIP, TV, satelit




Biologie Chimie Didactica Fizica Geografie Informatica
Istorie Literatura Matematica Psihologie

Informatica


Index » educatie » Informatica
» Modelul Flyweight


Modelul Flyweight


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

public class FolderFactory

public Folder getFolder(bool selected)

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


public class Folder

public void draw(Graphics g, int x, int y, string title)

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 Positioner

public void reset()

public int nextX()

public void incr()
else


public int nextY()



Apoi, putem scrie o rutina mult mai simplu

private void picPaint(object sender, PaintEventArgs e )

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



namespace csPatterns

public void init(int x, int y)

public void setSize(int w_, int h_)

public bool contains(int xp, int yp)
}

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)
posn.incr ();
i++;

//only refresh if mouse in new rectangle
if( !oldname.Equals ( selectedName))

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.






Politica de confidentialitate





Copyright © 2024 - Toate drepturile rezervate